Something như thế là khá đơn giản để kiểm tra (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;
}
và đầu ra của đó là:
4
2665056
2665400
1344
Lưu ý chuyển đổi của các con trỏ để int
giá trị trong đó printf
cuối cùng. Nếu không có điều này, 1000
sẽ được chia tỷ lệ là int *
, đưa ra giá trị sai.
Vì vậy, có, dòng dưới cùng, lý do của bạn là chính xác.
(a) Đó không luôn trường hợp vì một số khía cạnh của ngôn ngữ C có thể khác nhau giữa các hiện thực (hành vi thi hành chỉ định) hoặc trong bất kỳ cách nào họ muốn (hành vi undefined).
Hạnh phúc, bố trí các mảng là quy định cụ thể của tiêu chuẩn, trong C11 6.5.2.1 Array subscripting
:
2/Một biểu thức postfix tiếp theo là một biểu hiện trong dấu ngoặc vuông []
là một định subscripted của một phần tử của một mảng vật. Định nghĩa của toán tử số đăng ký []
là E1[E2]
giống hệt với (*((E1)+(E2)))
. Do quy tắc chuyển đổi áp dụng cho toán tử nhị phân +
, nếu E1
là đối tượng mảng (tương đương, con trỏ đến phần tử ban đầu của đối tượng mảng) và E2
là số nguyên, E1[E2]
chỉ định thành phần E2-th
của E1
(đếm từ 0).
3/Toán tử con số liên tiếp chỉ định một phần tử của đối tượng mảng đa chiều. Nếu E
là mảng n chiều (n> = 2) có kích thước i * j * ... * k
thì E
(được sử dụng không phải lvalue) được chuyển thành con trỏ thành mảng (n - 1) có kích thước j * ... * k
.Nếu toán tử *
đơn nhất được áp dụng cho con trỏ này một cách rõ ràng, hoặc ngầm định là kết quả của subscripting, kết quả là mảng tham chiếu (n - 1), mà chính nó được chuyển đổi thành một con trỏ nếu được sử dụng không phải là một lvalue. Sau đó, các mảng được lưu trữ theo thứ tự hàng lớn (chỉ số cuối cùng thay đổi nhanh nhất).
Nghe hay với tôi. – JS1