일단 전체 코드를 삽입해보겠다.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int pswap(int** pa, int** pb);
int main()
{
int a, b;
int* pa, * pb;
pa = &a;
pb = &b;
printf("pa 가 가리키는 변수의 주소값 : %p \n", pa);
printf("pa 의 주소값 : %p \n \n", &pa);
printf("pb 가 가리키는 변수의 주소값 : %p \n", pb);
printf("pb 의 주소값 : %p \n", &pb);
printf("---------------호출---------------------\n");
pswap(&pa, &pb);
printf("--------------호출끝---------------------\n");
printf("pa 가 가리키는 변수의 주소값 : %p \n", pa);
printf("pa 의 주소값 : %p \n \n", &pa);
printf("pb 가 가리키는 변수의 주소값 : %p \n", pb);
printf("pb 의 주소값 : %p \n", &pb);
return 0;
}
int pswap(int** ppa, int **ppb) //여기서 **는 포인터의 주소를 의미하니까 ** ! * *
//그러므로 포인터인 pa 의 주소값이 바뀌는 것이 아닌 포인터 pa 가 가리키는 변수의 주소값이 바뀐다.
//특정한 타입의 변수의 값을 바꾸려면, 특정한 타입을 가리키는 포인터로 인자를 취해야 된다.
// 이 경우 특정한 타입은 int * 타입이므로 int * 를 가리키는 포인터의 타입은 int ** 이다.
{
int* temp = *ppa;
printf("ppa 가 가리키는 변수의 주소값 : %p \n", ppa);
printf("ppb 가 가리키는 변수의 주소값 : %p \n", ppb);
*ppa = *ppb;
*ppb = temp;
return 0;
}
실행결과
pa 가 가리키는 변수의 주소값 : 000000CB0857FBF4
pa 의 주소값 : 000000CB0857FC38
pb 가 가리키는 변수의 주소값 : 000000CB0857FC14
pb 의 주소값 : 000000CB0857FC58
---------------호출---------------------
ppa 가 가리키는 변수의 주소값 : 000000CB0857FC38
ppb 가 가리키는 변수의 주소값 : 000000CB0857FC58
--------------호출끝---------------------
pa 가 가리키는 변수의 주소값 : 000000CB0857FC14
pa 의 주소값 : 000000CB0857FC38
pb 가 가리키는 변수의 주소값 : 000000CB0857FBF4
pb 의 주소값 : 000000CB0857FC58
출력 결과는 주소값들 이므로 개개인의 컴퓨터 환경에 따라 달라진다. 여기서 중요한 것은 pa 와 pb 의 주소값이 변경되는 것이 아닌 pa 와 pb 가 가리키는 변수의 주소값이 서로 swap 되는 것이다.
pa 가 가리키는 변수의 주소값은 (즉, pa 의 값) 000000CB0857FC38 pb 가 가리키는 변수의 주소값은 000000CB0857FC14 이다. 그런데 pswap 함수를 실행한 후 서로 변경되었다. 즉 두 포인터가 가리키는 변수가 서로 뒤바뀐 것이다. 이런 함수를 만들기 위해 인자를 어떤 형식으로 취해줘야 할지 고민해야 한다. 특정한 타입의 변수의 값을 바꾸려면 특정한 타입을 가리키는 포인터로 인자를 취해야 한다. 이 예제의 경우 특정한 타입은 int* 타입이다. 그러면 int* 타입을 가리키는 포인터의 타입은 int** 타입이라고 할수 있다. 그러므로 swap 해주는 함수인 pswap 의 인자를 (**ppa, **ppb) 로 설정해주면 된다.
우리가 위 처럼 pswap 함수를 호출하면 ppa 는 pa 를 가리키고 있고, ppb 는 pb 를 가리키고 있다. 따라서 *ppa 는 pa 의 값이다. 그런데 pa 는 int* 형이므로 pa 의 값을 보관하는 변수는 반드시 int* 이어야 한다.따라서 우리는 int* 형의 temp 변수를 정의하였다.
우리는 위 두개의 printf 문장에서 ppa 를 출력하면 pa 의 주소값이 나오고 ppb 도 마찬가지이다.

| c 언어 " " 와 ' ' 의 차이점 및 문자열 (0) | 2022.01.27 |
|---|---|
| 함수 포인터 설명 (0) | 2022.01.27 |
| 히프 정렬 (0) | 2021.10.31 |
| 히프의 구현 (0) | 2021.10.31 |
| 우선순위 큐 (0) | 2021.10.28 |
댓글 영역