Skip to content

pointer array and array pointer {Pointer Artithmetic}


what do you mean by int (*ptr)[10]

A) ptr is an array of pointers to 10 integers

B) ptr is a pointer to an array of 10 integers

C) ptr is an array of 10 integers

D) Invalid statement


정답은 D인 줄 알았으나 B였다. 꼭 변수명 앞에 *을 붙이고 괄호로 감싼다고 그것이 함수포인터라는 것은 아니다. 처음엔 함수포인터의 형태 type (*var_name)(args)가 아니라고 판단하여 D를 찍은 것이었고, 사실 이것은 포인터 배열배열 포인터 사이의 관계에 대한 내용을 이해하고 있는지에 대한 문제였던 것이다.

int *ptr[10] 는 연산자 우선순위 규칙에 의해 int * (ptr[10])으로 변환된다. 따라서 그대로 읽으면 int * 원소 10개를 담은 ptr이 된다. 타입은 int *[10]이다. stride는 10이다.

int (*ptr)[10]int 원소 10개를 담은 배열을 가리키는 포인터이다. 타입은 int (*)[10]이다. stride는 10이다.

int ptr[10]int 원소 10개를 담은 배열이다. 타입은 int [10]이다. stride는 10이다. 중요한 점은 ptr == &ptr이라는 점이다. 자세한 정보는 #array pointer를 참고하라.

int *ptrint 원소를 가리키는 포인터이다. 타입은 int *이다. stride는 1이다.

array pointer and array#

적절한 예시들이 있기에 가져왔다. 배열을 가리키는 포인터 ptrarr의 주소를 값으로 가지고 있다. *ptrarr의 첫번째 원소의 주소를 가리키게 될텐데, 사실 두 값은 같다! 나는 처음엔 별도의 arr를 위한 공간과 배열 {1, 2, 3, 4, 5}를 위한 공간이 마련된 다음 arr이 배열의 첫번째 원소의 주소를 값으로 가지고 있는 것으로 생각했으나 나의 생각이 틀렸다.

다만, arr&arr이 완전히 같은 것은 아니다. 아래의 예시를 통해 보게되면, sizeof(arr) = 20인데 반해 sizeof(&arr) = 8이라는 점이다. 두 차이점을 궁금해 한 어떤 사람이 질문을 올렸고 https://stackoverflow.com/a/2528328/21369350 에서 확인해 보기 바란다.

한 마디로 정리하자면, arr의 stride는 1이고, &arr의 stride는 N이다.

  • arr
    • sizeof(arr) is number of element * size of element type
    • stride of arr is 1
  • &arr
    • sizeof(&arr) is size of pointer type
    • stride of &arr is N
long arr[] = {1, 2, 3, 4, 5};
long *p = arr;
long(*arrptr)[5] = &arr;
long *ptrarr[5] = {arr, arr + 1, arr + 2, arr + 3, arr + 4};
p: 140731009609168
arrptr: 140731009609168 # arrptr는 &arr이다
ptrarr: 140731009609200 # ptrarr는 별개의 배열이다.
arr: 140731009609168 # stride 5짜리 배열의 주소
&arr: 140731009609168 # stride 1짜리 

*p: 1
*arrptr: 140731009609168 # *arrptr는 arr이다
*ptrarr: 140731009609168 # *ptrarr는 arr이다
*arr: 1

sizeof(p): 8 # pointer 8byte
sizeof(arrptr): 8 # pointer 8byte
sizeof(ptrarr): 40 # pointer 8byte * 5
sizeof(arr): 20 # int 4byte * 5
sizeof(&arr): 8 # pointer 8byte

sizeof(*p): 4
sizeof(*arrptr): 20
sizeof(*ptrarr): 8
sizeof(*arr): 4

&arr[5]: 140731009609188
&arr + 1: 140731009609188
arrptr + 1: 140731009609188
ptrarr + 1: 140731009609208