처음으로 c언어 공부하는데 배열의 원소를 서로 바꿔서 출력하고 싶은데 도와주세요.
글쓴이: 77team / 작성시간: 월, 2016/01/04 - 10:01오후
#include<stdio.h>
#define size 5
void exchangeArray(int *a, int *b, int n);
void printArray(int a[], int n);
int main(void){
int a[size] = {10,20,30,40,50};
int b[size] = {50,40,30,20,10};
printArray(a, size);
printArray(b, size);
exchangeArray(&a[size], &b[size], size);
printArray(a, size);
printArray(b, size);
return 0;
}
void exchangeArray(int *a, int *b, int n){
int temp;
temp = *a;
*a = *b;
*b = temp;
}
void printArray(int a[], int n){
int i;
for(i = 0; i < n; i++){
printf("%d \n", a[i]);
}
}이렇게 썻는데 exchangeArray 함수가 작동을 안하는 것 같네요.. 뭐가 문제죠?
Forums:


작성하신 코드는..
작성하신 exchangeArray는 int형 변수 값 하나를 서로 교환하는 함수입니다.
즉, 원하는 배열의 모든 요소들을 교환하지는 않는다는 말입니다.
왜 그런가? 를 생각해보면..
배열의 이름(코드의 a와 b)은 일종의 상수 포인터입니다.
포인터가 일반 변수와 다르게 메모리 주소값을 가지는 변수라는 점에서는 같으나
가지고 있는 메모리 주소값을 변경할 수 없다라는 점에서 일반 포인터와 차이가 있습니다.
일반적인 포인터는 ...
int a = 0, b =1; int *ptr = 0; // 포인터가 가지는 메모리 주소값은 0이라고 초기화. ptr = &a; printf("%d", *ptr); // a 값인 0이 출력 ptr = &b; printf("%d", *ptr); // b 값인 1이 출력위처럼 가지는 주소값을 변경이 가능합니다.
하지만 배열은 ...
int a[1] = {1}; int b[1] = {2}; a = b; // 에러 발생,위처럼 단순한 할당으로는 변경이 불가능합니다.
일반적으로 어떠한 타입의 배열은 의미적으로 다음처럼 표현이 가능합니다.
그렇다면..
어떻게 복사해야 할까요? 를 생각해보면...
배열의 이름을 통해서 각 배열의 요소들을 하나씩 교환해 주어야 합니다.
int a[3] = {0,1,2}; int b[3] = {11,12,13}; for (int i = 0; i < sizeof(a)/sizeof(int); ++i) { int tmp = a[i]; a[i] = b[i]; b[i] = tmp; }이러한 지식을 바탕으로 만들려고 했던 exchangeArrary를 바꿔주고,
당연히 함수 호출시에도 인자로 넘겨주는 것이 달라지겠죠?
코드는 직접 짜보시길...
/* How to Love Others */
while(GetDepth(Love) < Enough) DoLove();
생각을 달리해보면.
...
굳이 데이터를 바꾸지 않더라도.
출력만 b, a로 바꿔도 되겠네요. ㅇ_ㅇ;;
----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.
매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.
각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com
ㅋㅋㅋㅋㅋㅋㅋㅋㅋ눈팅하다가 뿜었습니다.
댓글이 너무 웃겨서요 ㅋㅋㅋㅋㅋㅋㅋㅋ
저 같은 경우에는요..
exchangeArr함수에 인자를 가져가실때 질문자 께서는 &a[size], &b[size], size
이렇게 가져가셨는데요.
생각해보면 현재 size는 5입니다.
즉 a[5], b[5]의 각각 주소를 인자로 가져간다는 말이 되는데 이렇게 되면 실수를 하기 쉽습니다.(out of range)
저같은 경우에는
exchangeArray(a, b, size);
이런식으로 항상 가져갑니다. 왜냐하면 배열의 이름 자체는 그 변수의 주소 시작점이기 때문이죠.
void exchangeArray(int *a, int *b, int n)
{
int temp;
int i;
for(i = 0; i < n; i++)
{
temp = a[i];
a[i] = b[i];
b[i] = temp;
}
}
함수의 원형은 이렇게 하시면 되겠네요.
댓글 달기