我正在浏览一本书,在那里我发现了这个问题
提及数组名称是否会在所有上下文中给出基地址?
有人可以解释数组名称不给出基地址的情况吗?谢谢
数组到指针的衰减并非无处不在。一个例子是 的论点sizeof
,另一个是 的论点&
:
int arr[10];
sizeof(arr); // gives 10 * sizeof(int), NOT sizeof(int*)
int (*p)[10] = &arr; // gives the address of the array, NOT of an rvalue
第二个例子相当明显,因为数组到指针衰减的值不是左值,所以它没有任何其他意义。
6.2.3.1 左值、数组和函数指示符
3 除非它是运算sizeof
符、运算符_Alignof
或一元&
运算符的操作数,或者是用于初始化数组的字符串字面量,否则类型为 ''array of type '' 的表达式将转换为类型为 ' 的表达式'pointer to type '' 指向数组对象的初始元素并且不是左值。如果数组对象具有寄存器存储类,则行为未定义。
所以,给定一个像这样的声明
int a[N];
以下表达式不会将表达式转换a
为指针类型:
sizeof a
_Alignof a
&a
鉴于以下声明
char str[] = "This is a test";
char *p = "This is another test";
字符串文字"This is a test"
用于初始化 的数组char
,因此不会将其转换为指针表达式;相反,数组的内容将被复制到str
. 相反,字符串文字"This is another test"
不用于初始化数组,因此将其转换为指针表达式,并将指针的值写入p
.
一种这样的上下文是sizeof
运算符,其中sizeof(array)
给出了数组的(字节)大小。
数组名称给出第一个元素的地址:
int a = {1,2,3};
假设a的地址是12
printf(" %u %u",a,&a);
结果是
12 12
其中 a 是第一个元素的地址, &a 是数组的地址。相同的值但不同的语义
printf(" %u %u", a+1, &a+1);
结果是
14 18
a 增加了 2,因为 'a' 是整数的地址,并且 a+1 增加了 2,即 sizeof(int)
其中 &a+1 按数组大小创建,即 3 int = 3 * sizeof(int)
假设 int 的 sizeof 为 2