这是我编写的用于测试/理解数组中指针行为的代码
int main(void){
int a[4];
memset(a, 0, sizeof(a));
printf("%x %x\n",a,&a);
}
Output of the above program on my machine:
bfeed3e8 bfeed3e8
我不明白为什么值 a 和 &a 是相同的。据我了解 &a 应该给出存储 a 的内存位置的地址。这种行为的解释是什么?
&a
确实给了你的地址a
。a
给你a
,因为它是一个数组,它衰减到一个指向a
.
或者学究起来,它衰减为指向a[0]
.
在这种情况下,数组名称a
衰减为指向其第一个元素的指针。你的意思是
printf("%x %x\n",a[0],&a);
该表达式&a
具有类型int (*)[4]
(指向 的 4 元素数组的指针int
)并计算为数组对象的地址;在这方面,指向数组的指针就像指向其他任何东西的指针。
奇怪的是如何a
处理表达式。除非它是sizeof
或一元运算符的操作数&
,或者是用于在声明中初始化另一个数组的字符串文字,否则“N 元素数组T
”类型的表达式将替换为 / 转换为 /“衰减”为类型的表达式T *
(指向T
),其值是数组中第一个元素的地址。由于数组的地址和数组中第一个元素的地址相同,因此两个表达式产生相同的value,但它们的类型不同。
数组的名称也指向它所持有的内存块的开始。没什么大不了的。
这些都是等价的:
printf("%x\n",a);
printf("%x\n",&a);
printf("%x\n",&a[0]);
在指针上下文中,数组衰减为指针。所以a
衰减到数组第一个字节&a
的地址,定义为第一个字节的地址。可能您想在 printf中使用*a
ora[0]
而不是。&a
int test[10] = test is pionter as well as &test
如果您想处理除 base 以外的元素,请使用 &test[4]
顺便提一句
&test = @test[0] = test
所有指向基本元素的指针
数组名“a”指向数组的第一个元素。
为了更好地理解:
*(a + 2) is same with a[2].
在 C 语言中,数组名在这种情况下a
被认为是一个标签,它表示数组的地址。对它应用 & 符号被解释为同样的事情。
函数指针也有类似的问题。如果func
是指向函数的指针,您可以同时使用func()
和调用该函数(*func)()
。
有间接语法的情况,以特殊方式处理。