我正在阅读一本书,我发现了这个问题
提到数组名称是否在所有上下文中都给出了基址?
有人可以解释数组名称没有给出基址的情况。谢谢
答案 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)
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