포인터 상수

|






#include <stdio.h>


int main(void) {

int arr[4] = {1, 2, 3, 4};


printf("&arr = %p\n", &arr);    // 0012FF54

printf("arr = %p\n", arr);       // 0012FF54

printf("&arr[0] = %p\n", &arr[0]);    // 0012FF54


return 0;

}


arr과 &arr 이 출력하는 메모리주소는 분명 같습니다만,


그 의미에는 미묘한 차이가 있습니다.


익히 아시고 계신 것처럼 arr은 &arr[0] 과 같은 의미이며, 그 data type은 배열의 data type입니다.


즉 arr + 1의 의미는 arr[0]에서 int형의 size만큼, 4byte 이동한 주소, &arr[1]을 의미할 수 있습니다


하지만 &arr은 그렇지 않습니다. &arr은 arr이라는 이름의 int형 4개짜리 일차원 배열의 시작주소입니다.


이것은 즉 (&arr) + 1 이 &arr[1] 을 의미하지 않음을 말합니다.


이러한 맥락에서 (&arr) + 1은 arr[0]에서 int형의 size*배열의 데이터 갯수(4) 를 곱한만큼 이동한 곳


의 주소입니다. 다음의 코드를 봐주세요.


int a[4] = {0, 1, 2, 3};


int (*pa)[4] = &a; /* 그냥 a를 쓰면 에러가 납니다 &a[0]과 &a는 의미하는 바가 달라서입니다


pa는 int형의 데이터 4개를 가지는 일차원배열을 가리키는 포인터입니다 */

pa++; /* 메모리 주소가 sizeof(int) * 4(배열데이터갯수) 만큼 이동합니다 */

printf("%d\n", (*pa)[-1]); /* pa가 가리키는 일차원 배열을 참조한 후 -1 인덱스,

즉 이는 a[3]을 의미합니다 */


출력되는 값은 물론 3입니다 :)


PS) int (*pa)[4]; /* 위에 나온대로 일차원배열을 가리키는 포인터를 선언합니다 */

int *pa[4]; /* int형의 포인터 4개를 가지는 일차원배열을 선언합니다 */











'C' 카테고리의 다른 글

itoa 대신 sprintf  (0) 2010.06.26
volatile  (0) 2010.06.26
문자열  (0) 2010.06.13
구조체  (0) 2010.06.12
버블 정렬 c 0609  (0) 2010.06.09
And