뭔가 확인하는 매우 간단입니다 (A) :
#include <stdio.h>
int main (void) {
int a[2][3][4][5];
// Ignore incorrect format specifiers for now.
printf ("%d\n", sizeof(int));
printf ("%d\n", &(a[0][0][0][0]));
printf ("%d\n", &(a[1][1][1][1]));
printf ("%d\n", (int)&(a[1][1][1][1])
- (int)&(a[0][0][0][0])
+ 1000);
return 0;
}
그의 출력은 다음과 같습니다 int
값으로 포인터의
4
2665056
2665400
1344
참고 변환 그 마지막에 printf
. 이 값이 없으면 1000
은 int *
으로 조정되어 잘못된 값을 제공합니다.
네, 결론은 틀렸다고 생각합니다.
(a)는 그들이 원하는하지 항상 C 언어의 일부 측면이 구현에 걸쳐 (구현에 지정된 동작을) 다를 수 있기 때문에 경우 또는 어떤 식 으로든 것 (정의되지 않은 동작). 다행히도
가 배열 의 레이아웃 C11 6.5.2.1 Array subscripting
에서 표준으로 상세 규정이다 대괄호 표현 하였다
2/A 접미사 식 []
배열 요소의 첨자 지정 인 목적. 아래 첨자 연산자 []
의 정의는 E1[E2]
이 (*((E1)+(E2)))
과 동일하다는 것입니다. 이진 +
연산자에 적용되는 변환 규칙으로 인해 E1
이 배열 객체 (즉, 배열 객체의 초기 요소에 대한 포인터)이고 E1[E2]
은 E2-th
요소를 E1
(0부터 세 수)으로 지정하면 정수입니다.).
3/연속 첨자 연산자는 다차원 배열 객체의 요소를 지정합니다. E
이 차원이 i * j * ... * k
인 n 차원 배열 (n> = 2) 인 경우 E
(왼쪽 값 외의 것으로 사용됨)은 차원이 j * ... * k
인 (n - 1) 차원 배열에 대한 포인터로 변환됩니다.단항 *
연산자가이 포인터에 명시 적으로 적용되거나 암시 적으로 하위 스크립팅의 결과로 적용되는 경우 결과는 참조 된 (n - 1) 차원 배열이며 lvalue가 아닌 다른 포인터로 사용되는 경우 포인터로 변환됩니다. 배열은 행 우선 순서대로 저장됩니다 (마지막 첨자는 가장 빠르게 변합니다).
나에게 좋은 소리. – JS1