# 더블 포인터! 제대로 알고 써먹기!
더블포인터의 개념을 적당히 알고 있나요?! 흔히 이중포인터라 불리는 개념을 그리 많이 사용해보지 못하던 찰나에,실제로 문제에 봉착하여 이렇게 포스팅을 해 봅니다. 많은 도움되길 바랍니다!
더블포인터(double pointer)란?
> 말 그대로 포인터가 이중으로 사용된 경우를 말한다. 싱글포인터 주소값을 가르키기 위해 사용된다.
이런식으로 "싱글포인터를 가리키는 포인터가 더블포인터다 !" 라고 말씀 드릴수 있겠습니다!
그렇다면 why?! 더블 포인터라는 개념이 필요한건지 궁금해 하실 겁니다.
void func(char* _ptr){ _ptr = (char*)1; } int main() { char* ptr = NULL; printf("before call is %x\n", ptr); func(ptr); printf("after call is %x\n", ptr); return 0; }위 코드의 결과 값은 0, 0 입니다. call by value & reference 이라고 하지엔 주소값을 넘겨주어,, 뭔가 모호합니다.그렇다면 stack 메모리 구조로 해색해 봄으로써 해당 문제를 해결해 보도록 하겠습니다.(아래 그림에 0x0002 주소의 변수명은 _ptr입니다)
(정정합니다! 아래 보시는 메모리 스샷의 경우 포인터 또는 정수 값으로 할당시, 주소에 있어서 1씩 변화를 보이는데,, 이는 잘못된 표기로써 ,, 정수의 메모리 할당크기는 운영체제의 시스템(32, 64bit ..etc)체계에 따라 다르겠지만 정수는 4byte, 포인터변수는 4byte이므로 이를 인식하셔서 그림에 혼란 없으시길 바랍니다..예를 들어 바로 하단의 변수 ptr 포인터 변수의 경우 0x0001번째부터 할당되었으므로 다음 파라미터로 선언된 ptr은 0x0005번지 부터 할당되겠지요? 다음부턴 잘하겠습니다 ㅠㅠ)
int main() { char* ptr = NULL; // ptr변수를 메모리에 올리고 NULL 값으로 체워준후 printf("before call is %x\n", ptr); // 출력을 하면 0이 출력됩니다. func(ptr); // 함수가 호출되고 아래와 같은 출력을 보입니다.
/* 함수가 종료되고 _ptr 값은 스택에서 지워집니다 */ printf("after call is %x\n", ptr); // 출력값에 변화가 없습니다. return 0; }
void func(char* ptr) { ptr = (char*)1; // ptr에 값을 할당해도 main함수의 ptr에는 // 변동이 없다.(위의 그림을 보면 확인할수 있다.) }
void func(char** _ptr) // _ptr파라미터의 경우 포인터의 주소를 { // 받으므로 더블포인터로 정의한다 *_ptr = (char*)1; // _ptr이 가르키고 있는 주소의 값을 변경한다 } int main() { char* ptr = NULL; printf("before call is %x\n", ptr); // 0출력 func(&ptr); // 포인터의 주소값을 넘겨준다. printf("after call is %x\n", ptr); // 포인터 조작으로 1출력 return 0; }결과 값은 0,1이 출력된다! 이와같이 함수 외부의 포인터 값을 함수 내부에서 조작하기 위해 더블 포인터를 사용한다.
'Dev > C language' 카테고리의 다른 글
call by value와 call by reference 제대로 알기!! (2) | 2011.12.22 |
---|