2022. 3. 9. 23:21ㆍC
이중 포인터란?
포인터에 대한 포인터를 의미하며, 기억장소에 저장된 데이터를 가리키는 포인터를 다시 한번 가리키는 포인터이다.
사용 형식은
데이터형 **포인터;
char **pt;
위와 같이 선언했을 경우 **pt는 문자형의 데이터를 나타내고 *pt는 문자형의 데이터, 한마디로 **pt가 저장되어 있는 주소값을 가진다.
pt는 문자형의 데이터를 가리키는 주소값, 즉 *pt의 주소값이 저장되어 있는 기억장소의 주소값을 가진다.
a=20;
p=&a;라 생각을 해보자
a는 20의 값을 가지고 있고 그 주소 값은 &a (100)이라고 가정하자.
p = 100의 값을 가지고 있고 &p (200)의 주소 값을 가지고 있다고 하면
a = 20
&a = 100
p = 100
&p = 200
*p = 20이다.
&p는 정수형 변수 a의 주소를 저장하고 있는 p의 주소값이라는 사실을 확실히 알고 가야한다.
이후 p2 = &p
p2 = 200 이고 &p2 (300)의 주소 값을 가지고 있다고 하면
*p2 = 100
**p2 = 20 이 된다.
예제를 보자
int num1 = 10;
int *ptr = &num1;
int **pptr = &ptr;
printf("pptr : %p\n\n", pptr);
printf("*pptr : %p\n", *pptr);
printf("ptr : %p\n\n", ptr);
printf("**pptr : %d\n", **pptr);
printf("num1 : %d", num1);
출력 결과
pptr : 0x30634f9f0
*pptr : 0x30634f9fc
ptr : 0x30634f9fc
**pptr : 10
num1 : 10
pptr의 메모리주소 -> ptr의 메모리주소 -> 10 으로 인한 **pptr = 10이라는 결과를 볼 수 있다.
예제를 통해 좀 더 이해해보면
int num[2][3] = { {1,2,3}, {11,12,13}};
printf("num : %p\n",num);
printf("num[0] : %p\n",num[0]);
printf("num[0][0] : %p\n\n", &num[0][0]);
printf("num[1] : %p\n", num[1]);
printf("&num[1][0] : %p\n", &num[1][0]);
출력 결과
num : 0x30c3aa9e0
num[0] : 0x30c3aa9e0
num[0][0] : 0x30c3aa9e0
num[1] : 0x30c3aa9ec
&num[1][0] : 0x30c3aa9ec
배열의 주소값과 0번째 인덱스의 주소가 같다는 사실을 확인할 수 있다.
2차원 배열에서의 포인터 연산
int num[2][3] = { {1,2,3}, {11,12,13}};
printf("num : %d\n",num);
printf("num+1 : %d\n\n", num+1);
printf("num[0] : %d\n", num[0]);
printf("num[0]+1 : %d\n", num[0]+1);
출력 결과
num : 162048480
num+1 : 162048492
num[0] : 162048480
num[0]+1 : 162048484
잘보면 num과 num+1에 주소값의 차이가 12인것을 볼 수 있는데,
num 배열은 한 행에 int 자료형(4byte)가 3개씩 12byte 단위로 묶여있기 때문에 주소값 + 1 = 12씩 증가하는 것이다.
이중 포인터를 이용한 스왑함수
void swap(int **num1, int **num2);
int main() {
int num1 = 10;
int num2 = 20;
int *point_num1 = &num1;
int *point_num2 = &num2;
printf("변경전\n");
printf("num1 : %d\n", *point_num1);
printf("num2 : %d\n\n", *point_num2);
swap(&point_num1, &point_num2);
printf("변경후\n");
printf("num1 : %d\n", *point_num1);
printf("num2 : %d\n\n", *point_num2);
}
void swap(int **num1, int **num2){
int *tmp;
tmp = *num1;
*num1 = *num2;
*num2 = tmp;
}
출력 결과
변경전
num1 : 10
num2 : 20
변경후
num1 : 20
num2 : 10
이중 포인터를 사용하여 문자와 문자열을 출력하는 프로그램이다.
char *week[ ] ={"SUN","MON","TUE"}, **ptr;
int i;
ptr = week;
for (int i = 0; i < 3; i++) {
printf("%s ---", *ptr);
printf("%c \n", **ptr);
ptr++;
}
출력 결과
SUN ---S
MON ---M
TUE ---T
'C' 카테고리의 다른 글
C - 문자와 문자열 (0) | 2022.03.10 |
---|---|
C - 구조체 (0) | 2022.03.09 |
C - 자동변수와 정적변수 (0) | 2022.03.08 |
C - 재귀함수 (0) | 2022.03.07 |
C - 함수 (0) | 2022.03.07 |