#include <stdio.h>
int main(void)
{
float rootbeer[10];
scanf("%f",&rootbeer);
printf("%f\n",rootbeer[0]);
printf("%p\n",rootbeer);
printf("%d %d",sizeof(rootbeer),sizeof(&rootbeer));
return 0;
}
代码里在scanf读取浮点数时,存入的是&rootbeer,这里出现的疑问,&rootbeer不应该是数组首元素地址的地址吗?
这是带&和不带&的运行结果,可以看到两种运行结果是一样的。
解释:C语言规定,数组名代表数组的首地址,也就是第0号元素的地址。所以a==&a[0],但对数组名取地址时却要注意了,在理解“对数组名取地址”这一表达式的含义时一定要记住:数组名是“数组”这种变量的变量名
这样,&a就好理解了,它取的是“数组”这种变量的地址
我的理解:数组的地址就是首元素的地址,所以这里&a就是取了数组a的地址,而不是取了首元素地址的地址,因此,&a(数组的地址)和a(首元素的地址)是相同的地址,也就是scanf把这个值存入了首元素的地址中。
所以,这两种结果相同。
---------------------------------------------------------------------------------------------------------------------
刚在知乎上看到一个回答,感觉解释的很好,转载过来
#include "stdio.h"
int main()
{
int a[5] = { 1,2,3,4,5 };
int *ptr = (int *)(&a + 1);
printf("%d,%d", *(a + 1), *(ptr - 1));
/*getchar是用VS编写方便查看输出*/
getchar();
return 0;
}
作者:嵌入式Linux
链接:https://zhuanlan.zhihu.com/p/52640381
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
这个题目主要考察&a 和 a
- a 在这里代表是的数组首元素的地址即 a[0]的首地址,其值为 0x005efda0。
- &a 代表的是数组的首地址,其值为 0x005efda0。
- a+1 的值是 0x005efda0+1*sizeof(int),等于 0x005efda4。
- &a+1 的值是(0x005efda0 +(sizeof(a)= 5*sizeof(int))= 0x005efdb4 {0xcccccccc, 0xcb626a90, 0x005efdd0, 0x0029200e, 0x00000001}
那么输出便是2,5