sizeof 와 포인터
sizeof 는 배열의 크기를 return 한다.
sizeof(point변수) - > 주소값의 크기 4byte
#include<stdio.h>
int main()
{
char a[2][3][4];
char (*p)[3][4];
p = a;
// 배열로 선언 하면 sizeof 로 크기를 알 수있다.
printf("izeof(a) : %d\n", sizeof(a)); // char[2][3][4] = char (*)[3][4]
printf("izeof(*a) : %d\n", sizeof(*a)); // char[3][4] = char (*)[4]
printf("izeof(**a) : %d\n", sizeof(**a)); // char[4] = char (*)
printf("izeof(***a) : %d\n\n", sizeof(***a)); // char
printf("izeof(p) : %d\n", sizeof(p)); // char (*)[3][4]
// * 로 들어오면 배열과 똑같아진다.
printf("izeof(*p) : %d\n", sizeof(*p)); // char [3][4] = char (*)[4]
printf("izeof(**p) : %d\n", sizeof(**p)); // char[4]
printf("izeof(***p) : %d\n", sizeof(***p)); //
}
배열의 data type
char a[2][3][4]; 의 경우 a 배열의 data type 은 char[2][3][4] 이다.
sizeof 함수에서 배열의 크기 (2*3*4) 와 데이터 타입에 따른 크기 (char =1) 의 곱으로 결정된다.
위의 3차원 배열 a의 경우
*a 의 데이터 타입은 char[3][4] 배열이 나온다.
한칸 씩 들어 간다고 생각하면 편안하다.
a 의 포인터를 저장 할 수 있는 포인터 변수 p 의 경우 data type 은 char (*)[3][4] 이고 ,
sizeof 함수에서 p 포인터 변수는 주소 값을 가지고 있음으로 4byte 를 return 한다.
여기서 재미있는 점은 *p 의 datatype 이다.
p* 의 datatype 은 char[3][4] 로 배열의 데이터 타입과 동일해 진다.
따라서 sizeof(*p)의 경우 12 값을 return 하게 되는 것이다.
항상 햇갈리지만 char[3][4] 의 데이터 type 은 char (*)[4] 와 동일하게 동작함으로
+1 연산시 4개의 char 만큰 건너 뛴다(4byte)
댓글