개인노트
[C언어] 더블포인터 본문
* 더블 포인터란?
더블 포인터란 포인터를 참조하는 포인터를 말하며, 일반적인 포인터는 싱글 포인터라고도 한다.
int num=10; // 변수 선언 int *ptr = # // 포인터 ptr에 num의 주소값을 초기화하여 num을 가리킴 (싱글 포인터) int **dptr = &ptr; // 포인터 dptr에 포인터 ptr의 주소값을 넣어서 결국엔 num을 가리키게됨 (더블 포인터) |
밑의 예제 1을 보면 num1과 num2의 주소값을 포인터변수 ptr에 초기화 한 다음 함수를 이용하여 num1,2에 저장된 값을 바꾸려고 한다.
하지만 컴파일을 해보면 값을 변하지 않고 그대로이다. 왜인지 생각해보고 답을 찾았다면 예제2를 보자.
예제1.c |
#include <stdio.h> #include "stdlib.h" void SwapPtr(int * p1, int * p2) { int * tmp = p1; p1 = p2; p2 = tmp;
} int main(void) { int num1 = 10, num2 = 20; int *ptr1 = &num1, *ptr2 = &num2;
printf("ptr1 : %d, ptr2 : %d\n", *ptr1, *ptr2); SwapPtr(ptr1, ptr2); printf("ptr1 : %d, ptr2 : %d\n", *ptr1, *ptr2); system("pause"); } |
밑의 예제2번을 보면 num1,2에 저장된 값이 정상으로 뒤바뀐 것을 볼 수 있다. 그 이유를 살펴보자.
예제 1에서 보면 함수 SwapPtr을 불러올 때 포인터 변수 ptr1,2를 넣은 것은 num1,2의 주소값이 아닌 num1,2에 저장된 값을 대입한 것이다. num1,2에 저장된 값은 p1,2에 저장되었고 p1,2는 지역변수이므로 함수 SwapPtr에서만 적용이된다. 즉 num1,2에 저장된 값에 대한 변화는 없고 p1,2에 저장된 값만 서로 변경된 것이다. 이를 해결하려면 어떻게 해야할까?
바로 ptr1,2의 주소값을 p1,2에 넣어주면 된다. 그렇다면 저장된 값을 교환하는 것이 아니라 주소값을 교환하는 것이 되어서 저장된 값이 바뀌게되는 것이고 이것은 주소값은 함수에 관계없이 동일하기 때문이다.
예제2.c |
#include <stdio.h> #include "stdlib.h" void SwapPtr(int ** p1, int ** p2) { int * tmp = *p1; *p1 = *p2; *p2 = tmp;
} int main(void) { int num1 = 10, num2 = 20; int *ptr1 = &num1, *ptr2 = &num2;
printf("ptr1 : %d, ptr2 : %d\n", *ptr1, *ptr2); SwapPtr(&ptr1, &ptr2); printf("ptr1 : %d, ptr2 : %d\n", *ptr1, *ptr2); system("pause"); } |
'C > 문법' 카테고리의 다른 글
[C언어] 2차원 배열의 포인터 연산(증가감소) (0) | 2017.07.05 |
---|---|
[C언어] 2차원배열의 포인터 (0) | 2017.07.05 |
[C언어] 2차원 배열 선언과 초기화 (0) | 2017.07.04 |
[C언어] 다차원 배열 (0) | 2017.07.04 |
[C언어] 포인터 대상의 const 선언 (0) | 2017.07.03 |