C언어 :: 포인터의 배열터
C언어 :: 포인터의 배열터
C언어의 포인터의 포인터 대한 이해도를 높일 수 있는 글입니다.
포인터의 포인터
포인터의 포인터란 도대체 무엇인지 최대한 쉽게 작성해 보겠다. 포인터의 포인터는 포인터 변수를 가리키는 또 다른 포인터 변수를 뜻하는 것으로서 흔히 이중 포인터, 또는 더블 포인터라고 부른다. int ** dptr;
와 같이 선언할 수 있다.
헷갈리지 말자. 포인터 변수는 종류에 상관없이 무조건 주소 값을 저장하는 변수이다. 다만 차이가 나는 것은 포인터 변수가 가리키는 대상일 뿐이다.
1
2
3
4
int main() {
double num = 3.14;
double * ptr = # // 변수 num의 주소 값 저장
}
위 코드에서 변수 num과 ptr은 저장하는 값의 종류가 다를 뿐, 값의 저장이 가능하다. 즉 ptr도 메모리 공간에 할당이 되는 변수이기 때문에 이를 대상으로도 & 연산이 가능하며, 이때 반환되는 주소 값은 double형 더블 포인터 변수에 저장할 수 있다. double ** dptr = &ptr;
*dptr은 포인터 변수 ptr을 의미하고, **dptr은 변수 num을 의미한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
int main() {
double num = 3.14;
double *ptr = #
double **dptr = &ptr;
double *ptr2;
printf("%9p %9p \n", ptr, *dptr);
printf("%9g %9g \n", num, **dptr);
ptr2 = *dptr; // ptr2 = ptr
*ptr2 = 10.99;
printf("%9g %9g \n", num, **dptr);
return 0;
}
포인터 변수 대상의 Call-by-reference
다음 프로그램은 num1, num2의 값을 서로 변경하도록 작성한 것이다. 그러나 실제로 실행시 의도와 다른 결과가 출력됨을 볼 수 있다. 그 이유는 ptr1의 값이 *p1이라는 변수에 복사되었을 뿐이기 때문이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
void swapIntPtr(int *p1, int *p2) {
int *temp = p1;
p1 = p2;
p2 = temp;
}
int main() {
int num1 = 10, num2 = 20;
int *ptr1, *ptr2;
ptr1 = &num1, ptr2 = &num2;
printf("*ptr1, *ptr2: %d %d \n", *ptr1, *ptr2);
swapIntPtr(ptr1, ptr2);
printf("*ptr1, *ptr2: %d %d \n", *ptr1, *ptr2);
return 0;
}
다음과 같이 ptr1, ptr2의 주소 값을 전달해야 메모리에 접근하여 num1과 num2의 값을 서로 바꿀 수 있을 것이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
void swapIntPtr(int **dptr1, int **dptr2) {
int *temp = *dptr1;
*dptr1 = *dptr2;
*dptr2 = temp;
}
int main() {
int num1 = 10, num2 = 20;
int *ptr1, *ptr2;
ptr1 = &num1, ptr2 = &num2;
printf("*ptr1, *ptr2: %d %d \n", *ptr1, *ptr2);
swapIntPtr(&ptr1, &ptr2);
printf("*ptr1, *ptr2: %d %d \n", *ptr1, *ptr2);
return 0;
}
This post is licensed under CC BY 4.0 by the author.