[C] 포인터 변수를 사용하는 swap 함수의 이해
2024. 7. 28. 16:30ㆍMemorizing/C
포인터 변수를 배울 때 실패한 swap함수의 사례로 아래와 같이 작성한다.
#include <stdio.h>
void swap(int* a, int* b){
printf("swap func inner value a: %d, b: %d\n", a, b);
int tmp;
tmp = a;
a = b;
b = tmp;
}
int main()
{
int a = 10, b = 20;
printf("a value: %d, b value: %d\n", a, b);
swap(&a, &b);
printf("a value: %d, b value: %d", a, b);
return 0;
}
직관적으로 생각해보면 왜 위의 함수가 동작하지 않는 지 이해가 잘 안된다. swap함수 내부의 a 변수에는 main 함수 a변수의 주소값이 들어있을 것만 같기때문이다. 이것을 정확하게 이해하기 위해선 포인터 변수에 대해 이해해야한다.
포인터 변수에는 무엇이 들어있는가 ?
main 함수에서 swap 함수를 호출하면 int* a = &a와 같이 선언이 되는데, 이것을 의미론적으로 풀어쓰면 아래와 같이 될 것이다.물론완전다른방식의선언이다.
int *a
a = &a
중요한 것은 swap함수 내부의 a 변수에는 main 함수 a 변수의 주소가 들어가는 것이다. 따라서 swap 함수의 내부의 값을 찍어보면 아래와 같이 출력된다.
a value: 10, b value: 20
swap func inner value a: 1804793784, b: 1804793780
swap func inner value a: 1804793780, b: 1804793784
a value: 10, b value: 20
즉, 현재의 swap 함수에서는 내부 a, b 변수 주소값 교환이 일어나고 있는 것이다.
올바른 swap 함수의 작성
#include <stdio.h>
void swap(int* a, int* b){
printf("swap func inner value a: %d, b: %d\n", a, b);
int tmp;
tmp = *a;
*a = *b;
*b = tmp;
}
int main()
{
int a = 10, b = 20;
printf("a value: %d, b value: %d\n", a, b);
swap(&a, &b);
printf("a value: %d, b value: %d", a, b);
return 0;
}
따라서 두 변수의 값을 교환하는 swap함수를 올바르게 작성하려면 위와 같이 작성해야한다. swap함수의 a 변수에는 main 함수의 a변수의 주소가 들어있으므로 *을 통해서 de-referencing하면 main함수 a변수 메모리에 저장되어 있는 값에 접근할 수 있게 된다. 포인터 변수를 사용할 때 *를 사용하면 주소값에 있는 메모리 값에 직접 접근하는 것이라고 생각하면 될 것이다!
'Memorizing > C' 카테고리의 다른 글
[C] 문자열과 배열 0 | 2024.07.28 |
---|---|
[C] 배열 인덱싱 연산자 0 | 2024.07.28 |
[C] 왜 scanf에서는 주소값을 인자로 받는가 ? 0 | 2024.07.27 |
[C] int 그리고 음수의 표현에 대한 이해 0 | 2024.07.27 |