배열에 대한 포인터의 역 참조에서 sizeof는 어떻게 작동합니까?


9

여기 에 4 개의 정수 ptr배열 arr에 대한 포인터 가 있습니다. ptr전체 배열을 가리 킵니다. ptr[0]또는 *ptr배열의 첫 번째 요소를 가리 키므로 1을 추가하면 배열 ptr[0]의 두 번째 요소의 주소 가 제공됩니다.

사용 sizeof(ptr[0])하면 왜 첫 번째 요소의 크기가 아닌 16 바이트 전체 배열의 크기를 4 바이트로 제공 하는지 이해할 수 없습니다 ( 배열 ptr[0]의 첫 번째 요소를 가리킴).

int arr[4] = {0, 1, 2, 3};
int (*ptr)[4] = &arr;
printf("%zd", sizeof(ptr[0])); //output is 16

두 번째 줄이 아니어야합니까 int *ptr = arr;? 그러면 배열의 시작 (첫 번째 요소)을 가리키게됩니다 &arr[0].
Andreas Wenzel

1
@AndreasWenzel 두 번째 줄이 아니int *ptr = arr; 어야 합니까 ? 사실은 아닙니다. 네 값 의 전체 배열에 대한 포인터로 int (*ptr)[4]작성 합니다. 이와 같은 포인터 구문은 다차원 배열을 동적으로 할당하는 데 필요합니다. 중첩 루프로 생성 되고 다차원 배열로 잘못 설명 된 "2 차원 배열" 은 실제로 여러 개의 1 차원 배열에 대한 포인터의 1 차원 배열입니다. 참조 stackoverflow.com/questions/42094465/...ptrintmalloc()
앤드류 헨레

답변:


6

OP : ptr[0]배열의 첫 번째 요소를 가리 킵니다.

유형 혼란. ptr[0]배열입니다.

ptrint 배열 4에 대한 포인터 입니다. 배열에 대한 포인터를 지연시키는
ptr[0]것과 같습니다 . 배열의 크기입니다.*ptr
sizeof(ptr[0])


함께 sizeof(ptr[0]), ptr[0]수행하지 부과 "타입 표현 '입력 포인터'그 배열 오브젝트의 초기 요소를 가리키는 '전환. (c11dr §6.3.2.1 3). 하여 sizeof, ptr[0]배열된다.


1
@ Abd-ElrahmanMohamed 동의하지만 "ptr [0] [0]은 정수를 가리키는 정수가 아닙니다". "ptr [0]은 배열에서 첫 번째 요소의 주소입니다"는 사실이 아닙니다.
chux-복원 Monica Monica

1
@ Abd-ElrahmanMohamed 예, 값은 동일하지만 유형이 다릅니다. ptr [0]은 배열 유형을 &ptr[0][0]가지며 int *유형
Green Tree

1
@chux ptr[0](암시 적으로로 변환 됨 int *)는 첫 번째 int 요소의 주소로 평가됩니다.
그린 트리

1
sizeof에 대한 @chux-맞아, 나는 네가 한 말의 맥락을 잘못 이해했다
Green Tree

1
@ Abd-ElrahmanMohamed 그렇지 않습니다. printf("someforamt", ptr[0] , ptr[0]+1)와 다른 일을합니다 sizeof(ptr[0]). ptr[0]첫 번째 경우는 inplicit 변환을 통해 진행한다. 으로 sizeof(ptr[0]), ptr[0]하지 않습니다.
chux-복원 Monica Monica

5

ptr여기는 유형 pointer to an array of 4 int elements이며 배열 유형은 플랫폼에서 크기가 16입니다 (sizeof (int) * (elemetns 수)).

sizeof (ptr [0])을 사용하면 첫 번째 요소의 크기가 아닌 16 바이트 전체 배열의 크기를 제공하는 이유를 이해할 수 없습니다.

C 유형 시스템에는 배열 유형이 있기 때문입니다. 여기 모두 arr*ptr그것이있다. 당신이 가지고 있다고 선언하는 것. sizeof int를 얻으려면 sizeof (ptr [0] [0])-ptr [0]이 배열로 평가됩니다.


2

함께 int (*ptr)[4] = &arr ;당신은 네 개의 정수 배열에 대한 포인터와 편곡을 가리키고있다.

ptrarr이중 포인터처럼을 가리키고 있습니다. 우리는의 요소에 액세스 할 수 있습니다 arr사용하는 ptr[0][x]x이 될 수 0로를 4.

그래서 sizeof(ptr[0])와 동일sizeof(arr)


2

정의에 ptr[0]와 동일 *(ptr + 0)차례로와 동일하다 *ptr. 또한, ptr초기화됩니다 &arr그래서 *ptr입니다 *&arr그것은 단지입니다 arr. &arrin 의 중간 저장소는 어레이 붕괴를 수행 ptr하지 않으므로 동등성이 유지되고 유형 정보가 손실되지 않습니다.

이 모든 함정을 피하기 위해 컴파일 타임에 계산됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.