1

我正在浏览一本书,在那里我发现了这个问题

提及数组名称是否会在所有上下文中给出基地址?

有人可以解释数组名称不给出基地址的情况吗?谢谢

4

4 回答 4

5

数组到指针的衰减并非无处不在。一个例子是 的论点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

第二个例子相当明显,因为数组到指针衰减的值不是左值,所以它没有任何其他意义。

于 2012-10-11T11:22:23.910 回答
3

C 2011在线草案

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.

于 2012-10-11T12:51:59.510 回答
2

一种这样的上下文是sizeof运算符,其中sizeof(array)给出了数组的(字节)大小。

于 2012-10-11T11:22:07.490 回答
2

数组名称给出第一个元素的地址:

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

于 2012-10-11T11:23:41.153 回答