C 예제.
포인터를 이용해 두개의 실제 값을 바꿔보자 !!
SWAP 함수의 구현 !
해당 예제는 포인터를 배우기 시작할때 한번쯤은 해보는
단골손님으로 main 함수에서 입력받은 두개의 값이 담긴 변수를 swap 함수에게 전달해
swap 함수에서 각각의 변수에 담긴 값을 바꿔주고~ main 함수에서 해당 결과를 출력해보는
예제 입니다.
간단하니까 빠르게 시작합시다 !
자 우선 포인터를 사용하지 않은 상태에선 어떻게 되는지부터 볼까요 ?
#includevoid swap(int n1, int n2); int main() { int n1 = 0, n2 = 0; printf("Input 2 Num : "); scanf("%d %d", &n1, &n2); printf("Input n1[%d] n2[%d]\n", n1, n2); // 입력 받은 값을 확인차 출력을 해요. swap(n1, n2); // swap 함수를 호출해서 값을 넘겨요~ printf("Swap n1[%d] n2[%d]\n", n1, n2); // swap 함수를 다녀온뒤의 변수들의 값은 과연 !? return 0; } void swap(int n1, int n2) // 함수를 호출할때 전달해준 값을 n1, n2 에 채워준다는 뜻인거 아시죠 ? { int temp; // 임시 저장공간 !! n1 과 n2 의 값을 서로 맞바꾸기 위해 선언 했습니다. temp = n1; // 먼저 temp 에 n1 을 대입하고~ n1 = n2; // n1 은 temp 에 있으니 이제 안심하고 n1 에 n2를 대입 ! n2 = temp; // n2 의 값도 n1 로 이동 됐으니 이제 n2 에 temp에 저장되있는 n1 의 값을 대입 !! printf("!!!!! n1[%d] n2[%d]\n", n1, n2); // 서로 맞바꾼 값을 확인차 출력 !! }
이렇게 포인터를 사용하지 않고 ~ 코딩해서 실행을 해보니 ㅠㅠ 아뿔싸...
소스를 보고 그림을 보시면 아시겠지만..
출력 결과의 밑에 두줄을 보시면...
!!!! 부분은 swap 함수 안에서 n1 과 n2 의 값을 맞바꾼뒤 출력 한겁니다.
제대로 값이 바뀐게 확인이 됩니다 !!
하지만 swap 함수를 빠져나와서 다시 main 에서 출력을 하니까 !!!!
값이 다시 원래대로 돌아왔어요 ㅠㅠ..
왜인지는 다들 아시겠지만 ~ 아는척 하고싶으니까 한마디 할게요 ㅋ_ㅋ
이건 swap 함수에 있는 n1, n2 와 main 함수에 있는 n1, n2 와 서로 다른 변수이기 때문입니다.
좀더 다르게 말하자면 main 함수에서 swap 함수를 호출하면서 전달한건
n1, n2 가 갖고 있는 1과 2라는 값만 보내준 것이기 때문에 swap 함수에서 변경을 하든 말든 main 함수에 있는
n1 과 n2 라는 변수가 갖고 있던 1 과 2라는 값에는 전혀~ 변경이 되지 않는 것입니다.
그럼 swap 함수에서 변경한 것들을 main 에서도 똑같이 적용이 되게 하려면 !?
여기서 포인터가 들어가는거죠 ~ !
소스를 통해 알아봐요 !!
#includevoid swap(int *n1, int *n2); /* 아까는 swap(int n1, int n2); 였는데 지금은 별딱지( * )가 붙었죠 ? 별딱지를 붙여서 선언해주면 그건 얘는 포인터 변수 라는 뜻 입니다. 주소값을 저장하는 변수라는 뜻이지요 ? */ int main() { int n1 = 0, n2 = 0; printf("Input 2 Num : "); scanf("%d %d", &n1, &n2); printf("Input n1[%d] n2[%d]\n", n1, n2); swap(&n1, &n2); /* 짠! 여기도 보시면 위에 있던 소스랑 조금 다르죠 ? & 의 의미는 scanf 함수를 배우셨을때 들으셨을거에요. 변수 앞에 & 이 붙으면 그건 해당 변수가 가진 값을 의미하는게 아니라 해당 변수의 주소지를 의미 하게 됩니다. 함수를 호출할때 &n1 을 했으니 n1이 갖고 있는 값이 아닌 n1의 주소지가 넘어가게 되겠죠 ~ ? */ printf("Swap n1[%d] n2[%d]\n", n1, n2); return 0; } void swap(int *n1, int *n2) { int temp; /* 자 이제 main 함수에서 n1 과 n2 의 주소지를 넘겨 줬으니 swap 함수의 역할을 수행하기 위해 값을 변경 해야겠죠 ? 변수를 선언할때 별딱지( * ) 를 붙이면 이건 포인터 변수다 라는 뜻이지만 이렇게 아래 처럼 대입을 하는 부분에서 포인터 변수 앞에 별딱지를 붙이게되면 요건 해당 포인터 변수가 갖고 있는 값을 나타냅니다. */ temp = *n1; *n1 = *n2; *n2 = temp; printf("!!!!! n1[%d] n2[%d]\n", *n1, *n2); // 여기서도 우린 서로 바뀐 값을 출력하고 싶은거니까 주소지가 아닌 값이라는 뜻으로 // 별딱지를 붙여줍니다. }
요렇게 처음의 소스에 포인터를 활용하게끔 수정을 해주고
실행을 해보면 !?
처음이랑 다르게 main 함수에서 출력한 결과도
swap 함수에서 출력했을때와 동일하게
n1 과 n2 의 값이 변경돼서 출력 됩니다 !!
참 쉽죠 !?
이런 결과가 나올수있게된 이유는 !?
바로 main 함수로 부터 값 만 받아왔던 처음과는 다르게
이번엔 포인터를 이용해 main 함수에 있는 n1 과 n2 라는 변수의 실제 주소지를
넘겨 줬기 때문 입니다.
그로인해 swap 함수에서 값을 서로 바꿔준 결과가
main 함수에 있는 n1 과 n2 변수에도 적용이 된것이죠~!
혹시나 이해가 안가거나 궁금하신사항 또는 설명이 부족하다 싶은게 있다면
언제든 댓글 달아주세요 ~
'C/C++ > 예제' 카테고리의 다른 글
[C 예제] 정수 나눗셈 결과 소수로 나오게 하기. (1) | 2015.02.24 |
---|---|
[C 예제] return 의 의미와 간단한 예제를 통한 쓰임새 확인 (7) | 2014.11.13 |
[C 예제] 야구 게임 만들기 ( BaseBall ) (2) | 2014.06.25 |
[C 예제] switch 문으로 계산기 만들기. (0) | 2014.06.25 |
[C 예제] 파일 입출력을 이용해 연산결과 저장하기. (0) | 2014.06.24 |