상세 컨텐츠

본문 제목

포인터 swap (**pa, **pb)

Coding/자료구조(with C)

by 세미531 2022. 1. 26. 22:23

본문

728x90

일단 전체 코드를 삽입해보겠다.

#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 도 마찬가지이다.

 

728x90

'Coding > 자료구조(with C)' 카테고리의 다른 글

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

관련글 더보기

댓글 영역