본문으로 바로가기

   

 

포인터의 포인터는 포인터 변수를 가리키는 또 다른 포인터 변수를 뜻하는 것으로서 흔히 '이중 포인터' 또는 '더블 포인터'라 부르며 *연산자를 두 개 이어서 선언한다.
int ** dptr; // int형 이중 포인터

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

#include <stdio.h>

void main()
{
// 포인터의 참조 관계를 이해해보자 , 결과를 예상해보자
	double num = 3.14;
	double * ptr = &num;
	double ** dptr = &ptr;
	double * ptr2;

	printf("%9p %9p\n", ptr, *dptr);
	printf("%9p %9p\n", num, **dptr);
	ptr2 = *dptr;	//ptr2 = ptr과 같은 문장
	*ptr2 = 10.99;
	printf("%9p %9p\n", num, **dptr);
}

 


문제1)
Swap함수를 만들어 두 변수에 저장된 값을 서로 바꿔서 저장하고, 메인 함수에 호출하는 프로그램을 만들어보자.

#include <stdio.h>

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

void main()
{
	int num1 = 10;
	int num2 = 20;
	int * ptr1 = &num1;
	int * ptr2 = &num2;
	
	printf("바꾸기 전 : %d %d\n", *ptr1, *ptr2);

	Swap(&ptr1, &ptr2);
	printf("바꾼 후 : %d %d\n", *ptr1, *ptr2);
}

 

 

문제2)
다음과 같이 두 개의 int형 포인터 변수와 길이가 5인 int형 배열을 선언.
int * maxPtr;
int * minPtr;
int arr[5];
그리고 MaxAndMin이란 이름의 함수를 정의하고 이를 호출하면서 위의 배열과 두 포인터 변수에 대한 정보를 전달하자. 어떠한 정보를 어떻게 전달하는지는 알아서 결정해보자. 그리고 함수 호출이 완료되면, 포인터 변수 maxPtr에는 가장 큰 값이 저장된 배열요소의 주소 값이, minPtr에는 가장 작은 값이 저장된 배열요소의 주소 값이 저장되어야 한다.

#include <stdio.h>

void MaxAndMin(int *arr, int size, int ** maxPtr, int ** minPtr) {
	int * max, *min;
	int i;

	max = min = &arr[0];
	for (i = 0; i < size; i++) {
		if (*max < arr[i]) {
			max = &arr[i];
		}
		else if (*min > arr[i]) {
			min = &arr[i];
		}
	}

	*maxPtr = max;
	*minPtr = min;
}

void main()
{
	int * maxPtr;
	int * minPtr;
	int arr[5];
	int i;

	for (i = 0; i < 5; i++) {
		printf("정수를 입력해주세요 >>> ");
		scanf("%d", &arr[i]);
	}

	MaxAndMin(arr, sizeof(arr)/sizeof(int), &maxPtr, &minPtr);
	printf("최대 값 : %d\n최소 값 : %d\n", *maxPtr, *minPtr);
}