포인터의 포인터는 포인터 변수를 가리키는 또 다른 포인터 변수를 뜻하는 것으로서 흔히 '이중 포인터' 또는 '더블 포인터'라 부르며 *연산자를 두 개 이어서 선언한다.
int ** dptr; // int형 이중 포인터
double num = 3.14;
double * ptr = #
double ** dptr = &ptr;
#include <stdio.h>
void main()
{
// 포인터의 참조 관계를 이해해보자 , 결과를 예상해보자
double num = 3.14;
double * ptr = #
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);
}
'4. 프로그래밍 기초 > 4_2 C' 카테고리의 다른 글
[열혈 C프로그래밍] 함수 포인터와 void 포인터 연습문제 (0) | 2018.12.22 |
---|---|
[열혈 C프로그래밍] 2차원배열과 포인터 연습문제 (0) | 2018.12.22 |
[열혈 C프로그래밍] 다차원 배열 연습문제 (0) | 2018.12.22 |
[열혈 C프로그래밍] 포인터와 함수 연습문제 (0) | 2018.12.22 |
[열혈 C프로그래밍] 포인터와 배열 연습문제 (0) | 2018.12.22 |