처음으로 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)은 일종의 상수 포인터입니다.
포인터가 일반 변수와 다르게 메모리 주소값을 가지는 변수라는 점에서는 같으나
가지고 있는 메모리 주소값을 변경할 수 없다라는 점에서 일반 포인터와 차이가 있습니다.
일반적인 포인터는 ...
위처럼 가지는 주소값을 변경이 가능합니다.
하지만 배열은 ...
위처럼 단순한 할당으로는 변경이 불가능합니다.
일반적으로 어떠한 타입의 배열은 의미적으로 다음처럼 표현이 가능합니다.
그렇다면..
어떻게 복사해야 할까요? 를 생각해보면...
배열의 이름을 통해서 각 배열의 요소들을 하나씩 교환해 주어야 합니다.
이러한 지식을 바탕으로 만들려고 했던 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;
}
}
함수의 원형은 이렇게 하시면 되겠네요.
댓글 달기