728x90
반응형
값에 대한 swap
C언어에서 함수로 값을 넘길때는 call by value기 때문에 모든 값이 복사되어 넘어갑니다.
#include <stdio.h>
void swapValue(int *a, int *b)
{
int temp = *a;
*a = *b;
*b = temp;
}
int main()
{
int num, num2;
num = 1;
num2 = 2;
swapValue(&num, &num2);
printf("%d %d\n", num, num2);
}
따라서 함수를 통해 두 변수의 값을 바꿔주기 위해서는
1. 주소를 복사해서 인자로 넘긴다.
2. 주소에 접근(* 연산자)해서 직접 값을 바꿔준다.
라는 두가지 단계를 통해 값에 대한 swap을 구현할 수 있었습니다.
주소에 대한 swap
#include <stdio.h>
int main()
{
int num, num2;
num = 1;
num2 = 2;
int *a, *b;
a = #
b = &num2;
}
하지만 a, b와 같이 포인터 변수의 값(주소)은 어떻게 바꿀 수 있을까요?
포인터 변수도 포인터 변수의 주소를 함수에 넘겨 swap 하면 해결할 수 있습니다.
포인터 변수의 주소를 받기 위해서는 이중 포인터가 필요합니다.
void swapPointer(int **left, int **right)
{
...
}
left와 right는 이중 포인터 변수로 단일 포인터 변수의 주소를 담을 수 있습니다.
이제 위와 같이 swap 함수를 구현해보겠습니다.
void swapPointer(int **left, int **right)
{
int *temp = *left;
*left = *right;
*right = temp;
}
단일 포인터 변수 temp는 이중 포인터 left가 가지고 있는 값인 단일 포인터 변수의 주소를 저장합니다.
이후 이중 포인터 left에 접근(* 연산자)해서 이중 포인터 right가 가지고 있는 값인 단일 포인터 변수의 주소를 left에 저장합니다.
최종적으로 이중 포인터 right에 접근(* 연산자)하여 temp를 다시 저장하면 swap이 완료됩니다.
#include <stdio.h>
void swapPointer(int **a, int **b)
{
int *temp = *a;
*a = *b;
*b = temp;
}
int main()
{
int num, num2;
num = 1;
num2 = 2;
int *a, *b;
a = #
b = &num2;
printf("%d %d\n", *a, *b);
swapPointer(&a, &b);
printf("%d %d\n", *a, *b);
}
'언어 > C' 카테고리의 다른 글
[C언어] 배열 요소 접근과 포인터의 관계 (0) | 2022.06.15 |
---|---|
[C언어] 함수 포인터 (0) | 2022.06.12 |
[C언어] Dangling Pointer와 Memory Leak (0) | 2022.06.12 |