배열 포인터 정의

int *imsip;  // 1차원 배열 포인터
int (*imsip2)[ 3 ];  // 2차원 배열 포인터
int (*imsip3)[ 2 ][ 3 ];  // 3차원 배열 포인터

/* 1차원 배열의 sizeof */
#include <stdio.h>
main() {
  int imsi[ 2 ];
  int *imsip;

  printf( "%d\n", sizeof( imsi ) );  // 8
  printf( "%d\n", sizeof( imsip ) );  // 4
  printf( "%d\n", sizeof( *imsip ) );  // 4
}
.
/* 2차원 배열의 sizeof */
#include <stdio.h>
main() {
  int imsi[ 2 ][ 3 ];
  int ( *imsip )[ 3 ];

  printf( "%d\n", sizeof( imsi ) );  // 24
  printf( "%d\n", sizeof( imsip ) );  // 4
  printf( "%d\n", sizeof( *imsip ) );  // 12
}

*imsip 가 가리키는 대상체는 imsi[ 0 ][ 0 ] 하나가 아니라
imsi[ 0 ][ 0 ], imsi[ 0 ][ 1 ], imsi[ 0 ][ 2 ]이다.
( *imsip )[ 3 ] 에서 첨자에 사용된 3이라는 수치가 이를 나타내고 있다.
2차원 배열 포인터 변수의 배열 첨자는 열의 개수이다.

#include <stdio.h>
main() {
  int imsi[ 2 ][ 3 ] = { { 3, 5 }, { 12, 54 }, { 534, 923 } };

  printf( "%d byte\n", sizeof( imsi ) );  // 24
  printf( "%d byte\n", sizeof( imsi[ 0 ] ) );  // 8
  printf( "%d byte\n", sizeof( &imsi[ 0 ][ 0 ] ) );  // 4
}

imsi, imsi[ 0 ], &imsi[ 0 ][ 0 ] 는 확실히 같은 번지를 가리킨다.
하지만 가리키는 대상체의 크기가 다르다는 것을 위 예문에서 보여준다.
imsi 는 배열 전체를 가리키고 있다. ( 24 byte가 증명 )
imsi[ 0 ] 는 행을 대표하고 있다. ( 8 byte가 증명 )
&imsi[ 0 ][ 0 ] 는 하나의 배열 요소를 가리키고 있다.

int imsi[ 3 ] = { 5, 3, 7 };
int *imsip = imsi;

int imsi2[ 3 ][ 2 ] = { 7, 3, 2, 5, 3, 8 };
int (*imsip2)[ 2 ];

imsip 는 imsi 배열의 첫번째 요소를 가리킨다.
5, 3, 7 전부를 가리키는게 아니라 5만 가리킨다.
2차원 포인트 변수인 imsip2 는 2차원 배열이기 때문에 요소의 행을 가리킨다.
imsip 가 가리키는 대상은 4바이트고 imsip2 는 8 바이트이다.

WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,