반응형
포인터 변수도 변수의 한 형태이기 때문에 선언 시 메모리 영역에 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 }; 이런식으루요 그럼 단순히 그 주소값을 포인터 배열에 저장해주고 있습니다. 즉 메모리 공간의 낭비가 없다는거죠~!
넵!! 사실 별거 없습니다. 단지 개념의 확장일 뿐!!!...... 오늘은 이만 입니다^-^
반응형
'Basic > C/C++' 카테고리의 다른 글
[C언어] 제 20 강 : 매크로와 전처리기 (0) | 2012.01.27 |
---|---|
[C언어] 제 19 강 : 문자열 관련 표준 함수 (0) | 2012.01.26 |
[C언어] 제 18 강 : 메모리 관련 함수와 한정자 (0) | 2012.01.26 |
[C언어] 제 17 강 : 함수의 포인터 활용과 메모리 할당 (1) | 2012.01.24 |
[C언어] 제 16 강 : 배열과 포인터, 포인터 연산 (0) | 2012.01.22 |
[C언어] 제 14 강 : 포인터의 기본적인 개념 (0) | 2012.01.19 |
[C언어] 제 13 강 : 배열 (6) | 2012.01.19 |
[C언어] 제 12 강 : 비트연산자 (0) | 2012.01.16 |
[C언어] 제 11 강 : 서식문자 (0) | 2012.01.16 |
[C언어] 제 10 강 : 메모리 구조와 변수 (0) | 2012.01.12 |