这是我编写的代码,用于测试/理解数组
中指针的行为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的存储位置的地址。 对这种行为有什么解释?
答案 0 :(得分:9)
&a
确实为您提供了a
的地址。 a
为您提供a
,因为它是一个数组,它会衰减到指向a
的指针。
或者说是迂腐,它会衰减到指向a[0]
的指针。
答案 1 :(得分:4)
在该上下文中,数组名a
衰减为指向其第一个元素的指针。你的意思是
printf("%x %x\n",a[0],&a);
答案 2 :(得分:1)
表达式&a
具有类型int (*)[4]
(指向int
的4元素数组的指针)并计算数组对象的地址;在这方面,指向数组的指针就像是指向其他任何指针。
表达式a
如何处理是多么的奇怪。除非它是sizeof
或一元&
运算符的操作数,或者是用于在声明中初始化另一个数组的字符串文字,否则表达式为“{元素数组{{1 “替换为/转换为/”衰减“为类型T
的表达式(指向T *
的指针),其值是数组中第一个元素的地址。由于数组的地址和数组中第一个元素的地址相同,因此两个表达式都会产生相同的值,但它们的类型是不同的。
答案 3 :(得分:0)
数组的名称也指向它所拥有的内存块的开头。没什么大不了的。
这些都是等价的:
printf("%x\n",a);
printf("%x\n",&a);
printf("%x\n",&a[0]);
答案 4 :(得分:0)
在指针上下文中,数组衰减为指针。因此a
衰减到数组的第一个字节的地址,&a
是第一个字节的地址。您可能希望在printf中使用*a
或a[0]
代替&a
。
答案 5 :(得分:0)
int test[10] = test is pionter as well as &test
如果要处理base以外的元素,请使用& test [4]
BTW
&test = @test[0] = test
所有指向基本元素的指针
答案 6 :(得分:0)
数组名“a”指向数组的第一个元素。
为了更好地理解:
*(a + 2) is same with a[2].
答案 7 :(得分:0)
在C中,数组名称(在本例中为a
)被视为标签,表示数组的地址。对它应用放大器被解释为同样的事情。
函数指针存在类似问题。如果func
是指向函数的指针,则可以使用func()
和(*func)()
调用该函数。
存在间接语法的情况,以特殊方式处理。