数组的基地址

时间:2012-10-11 11:18:43

标签: c arrays pointers

我正在阅读一本书,我发现了这个问题

提到数组名称是否在所有上下文中都给出了基址?

有人可以解释数组名称没有给出基址的情况。谢谢

4 个答案:

答案 0 :(得分: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

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

答案 1 :(得分:3)

C 2011 online draft

6.2.3.1左值,数组和函数指示符

3除非它是sizeof运算符,_Alignof运算符或运算符的操作数  一元&运算符,或者是用于初始化数组的字符串文字,一个包含的表达式 类型'' type ''的数组被转换为类型为''指向 type ''指针的表达式                到数组对象的初始元素,而不是左值。如果数组对象有               注册存储类,行为未定义。

所以,给出像

这样的声明
int a[N];

以下表达式 not 将表达式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

答案 2 :(得分:2)

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

答案 3 :(得分: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'是整数的地址,+ 1增加2,即sizeof(int)

其中& a + 1按数组大小递增3 int = 3 * sizeof(int)

假设sizeof int为2