juuuding

CH 17 포인터의 포인터 본문

C언어/윤성우의 열혈 C

CH 17 포인터의 포인터

jiuuu 2023. 3. 17. 11:14

 1. 포인터의 포인터에 대한 이해

 

1. 포인터 변수를 가리키는 이중 포인터 변수 (더블 포인터 변수)

 포인터 변수는 종류에 상관없이 무조건 주소 값 저장하는 변수이다. 포인터 변수도 메모리 공간에 할당이 되는 변수인데, 이를 대상으로 &연산이 가능하며 이 때 반환되는 주소 값은 'double 포인터 변수'에 저장이 가능하다. "ptr = &num" 이고 "double ** dptr = &ptr" 이면 *dptr은 변수 ptr을 의미하고 **dptr은 변수 num을 의미한다. 

int main(void) {

	double num = 3.14;
	double* ptr = #
	double** dptr = &ptr;
	double* ptr2;

	printf("%9p %9p\n", ptr, *dptr);	//둘 다 0032F00 출력
	printf("%9g %9g\n", num, **dptr);	//둘 다 3.14 출력
	ptr2 = *dptr;	//ptr2 = ptr과 같은 문장
	*ptr2 = 10.99;

	printf("%9g %9g \n", num, **dptr);	//둘 다 10.99 출력

	return 0;

}

 

포인터의 참조관계

 

 

2. 포인터 변수 대상의 Call-by-reference

 

<실패한 변경>

void SwapIntPtr(int* p1, int* p2) {
	int* temp = p1;
	p1 = p2;
	p2 = temp;
}


int main(void) {

	int num1 = 10, num2 = 20;
	int* ptr1, * ptr2;
	ptr1 = &num1, ptr2 = &num2;
	pritnf("*ptr1, *ptr2: %d %d \n", *ptr1, *ptr2);	//10 20

	SwapIntPtr(ptr1, ptr2);
	printf("*ptr1, ptr2: %d %d\n", *ptr1, *ptr2);	//10 20

	return 0;

}

 위 코드에서 각 포인터들이 가리키는 대상을 변경하지 못한 이유는 "당연히 p1과 ptr1은 별개이고 p2와 ptr2도 별개이기 때문이다".

 

매개변수 전달 직후

 

 

함수 실행 후

 

이렇듯 p1과 p2에 저장된 값은 바뀌지만 이는 ptr1, ptr2와는 별개의 변수이기 때문에 ptr1은 여전히 num1의 주소 값을 ptr2는 여전히  num2의 주소 값을 저장하는 상태가 된다. 이를 해결하기 위해서는 함수 내에서 포인터 변수 ptr1과 ptr2에 직접 접근이 가능해야하는데, 이때 더블 포인터가 매개변수로 선언 되어야 한다.

 

<성공한 변경>

void SwapIntPtr(int** dp1, int** dp2) {
	int* temp = *dp1;
	*dp1 = *dp2;
	*dp2 = temp;
}


int main(void) {

	int num1 = 10, num2 = 20;
	int* ptr1, * ptr2;
	ptr1 = &num1, ptr2 = &num2;
	pritnf("*ptr1, *ptr2: %d %d \n", *ptr1, *ptr2);	//10 20

	SwapIntPtr(&ptr1, &ptr2);	//ptr1과 ptr2의 주소 값 전달
	printf("*ptr1, ptr2: %d %d\n", *ptr1, *ptr2);	//20 10

	return 0;

}

두 포인터 변수의 교환1

int* temp = *dp1;
*dp1 = *dp2;
*dp2 = temp;

이 코드는 dp1이 가리키는 변수와 dp2가 가리키는 변수에 저장된 값을 서로 교환하는 코드이다.

 

결국 ptr1, ptr2 각각에 저장된 값이 바뀌어서 이와 같은 형태가 된다. 

 

 

 

 2. 다중 포인터 변수와 포인터의 필요성

 

1. 이중 포인터를 가리키는 삼중 포인터

"삼중 포인터에 저장할 수 있는 값은 무엇인가요?" 라는 질문에는 "삼중 포인터 변수는 이증 포인터 변수를 가리키는 용도로, 이중 포인터 변수의 주소 값을 저장하는 용도로 사용됩니다."라고 답할 수 있어야 한다. 

 

 

2. 포인터의 필요성은 어디서 찾아야 하는가?

 포인터는 자료구조와 알고리즘을 공부할 때 필요성을 보다 더 확실하게 느낄 수 있다. 하지만 지금으로서는 포인터가 필요한 이유를 다음과 같이 이해하면 된다. "함수 내에서 함수 외부에 선언된 변수에 접근하는 방법을 제시해 줍니다."