본문 바로가기
Basic/C/C++

[C언어] 제 15 강 : 포인터의 포인터 그리고 포인터 배열

by boxbop 2012. 1. 19.
반응형


 포인터 변수도 변수의 한 형태이기 때문에 선언 시 메모리 영역에 4바이트의 메모리 공간 할당이 이뤄지기 때문에 당연히 포인터 변수 자체애 대한 주소 값도 존재를 하겠죠~?

 int number = 1;
 int* ptr = &number;

 printf("ptr의 저장 값은? %#x", ptr);
 printf("ptr의 주소 값은? %#x", &ptr);

 위의 소스 코드를 출력해보세요~
분명히 ptr의 저장 값과 주소 값은 다릅니다. ptr의 저장 값은 number변수의 주소 값이고 ptr의 주소 값은 말 그대로 포인트 변수 ptr의 주소 값이겠지요? 그렇습니다. 그리고 이 값을 다시 포인터 형 변수에 저장 할 수 있습니다. 즉, 포인터의 포인터(주소값)을 저장할 수 있는 것이죠^-^!!

 int number = 1;
 int* ptr = &number;
 int** dptr = &ptr;

 int** 라는 자료형이 보이시나요? 이것이 포인터의 포인터를 저장할 수 있는 자료형 입니다. 간접 참조 연산자 '*' 가 2개 붙어있는 모습이죠. 즉, 포인터 형이 int*인 변수의 주소 값은 포인터 형이 int**인 변수에 저장해야 합니다.

 dptr은 ptr의 주소값을 나타냅니다. *dptr은 무엇을 나타낼까요? ptr이 가지고 있는 값을 나타냅니다. number의 주소값이 되겠죠? 그렇다면 **dptr은 무엇일까요? number가 가지고 있는 값을 나타냅니다. 1이 되겠죠~? 천천히 잘 생각해 보시길 바랍니다.

 포인터 배열은 포인터 변수로 이뤄진 배열을 의미합니다. 즉 주소값들을 저장할 수 있는 배열이죠^-^

 int* arrayPtr[3];

이러한 코드는 int형 변수의 주소값을 저장할 수 있는 배열입니다. 이렇게 선언된 배열은 총 3개의 주소 값을 저장할 수 있겠네요~ 포인터 배열은 메모리 공간 절약에 있어서도 효율적입니다.

char array[3][9] = {"hello", "boxbop", "world"};
char* array[3] = {"hello", "boxbop", "world"};

 일단 모양은 비슷합니다만 char형 배열은 문자열의 크기를 넉넉하게 잡아줘야 됩니다. 총 27바이트가 할당되었죠. 그렇다고 모든 공간을 사용하지도 않습니다. 여분의 공간이 남아있는거죠. 메모리 상에서는 이 부분이 낭비입니다. 그러나 char* 포인터 형으로 선언을 해주었을때는 얘기가 달라집니다. 일단 문자는 메모리 자체에 우선적으로 저장이되고 주소값이 반환된다고 했죠?

char* array[3] = { 0x11, 0x22, 0x33 }; 이런식으루요 그럼 단순히 그 주소값을 포인터 배열에 저장해주고 있습니다. 즉 메모리 공간의 낭비가 없다는거죠~!
넵!! 사실 별거 없습니다. 단지 개념의 확장일 뿐!!!...... 오늘은 이만 입니다^-^
반응형