在大多数情况下,数组类型的表达式(“N-element array of T
”)将被 / 转换为 /“衰减”为指针类型的表达式(“指针T
”),表达式的值将是数组中第一个元素的地址。
所以,假设声明
int a[10];
表达式的类型a
是“10 元素数组int
”,或者int [10]
。但是,在大多数情况下,表达式的类型将被转换为“指向的指针int
”或int *
,并且表达式的值将等价于&a[0]
。
此规则的例外情况是数组表达式是一元运算符sizeof
或一元运算符的操作数&
,或者是用于在声明中初始化另一个数组的字符串文字。
因此,根据我们上面的声明,以下所有内容都是正确的:
表达式类型衰减为值
---------- ---- --------- -----
a int [10] int * a 的第一个元素的地址
&a int (*)[10] n/a 数组的地址,即
和第一个地址一样
元素
&a[0] int * n/a a 的第一个元素的地址
*a int n/a [0] 的值
sizeof a size_t n/数组中的字节数
(10 * sizeof (int))
sizeof &a size_t n/指针中的字节数
一个整数数组
sizeof *a size_t n/int 中的字节数
sizeof &a[0] size_t n/指向 int 的指针中的字节数
请注意,表达式a
、&a
和&a[0]
都具有相同的值( 的第一个元素的地址a
),但类型不同。类型很重要。假设如下:
int a[10];
int *p = a;
int (*pa)[10] = &a;
p
和都pa
指向 的第一个元素a
,我们假设它位于 address 0x8000
。执行行后
p++;
pa++;
但是,p
指向下一个整数(0x8004
,假设 4 字节int
s),而pa
指向下一个10 元素整数数组;即a
( 0x8028
) 的最后一个元素之后的第一个整数。