关于C语言中对数组取址的问题,详见补充:
问题简化一下:定义一个数组INT8Ua[4];然后对它进行强制转换(看官们不用考虑大小端的问题啊),有三种写法:1,*(INT32U*)a;2,*(INT32U*)(&a...
问题简化一下:定义一个数组INT8U a[4];
然后对它进行强制转换(看官们不用考虑大小端的问题啊),有三种写法:
1,*(INT32U *)a;
2,*(INT32U *)(&a[0]);
3,*(INT32U *)(&a);
请问第3种写法是否正确?我认为是错误的,但是为什么编译和实际运行都没有问题?如果是正确的,该如何理解? 展开
然后对它进行强制转换(看官们不用考虑大小端的问题啊),有三种写法:
1,*(INT32U *)a;
2,*(INT32U *)(&a[0]);
3,*(INT32U *)(&a);
请问第3种写法是否正确?我认为是错误的,但是为什么编译和实际运行都没有问题?如果是正确的,该如何理解? 展开
9个回答
展开全部
其实不难理解,你能理解2,你肯定能理解3,因2和3的是一样的。
只要你理解了:数组名该数组的首地址,那么&a[0]就是等价于&a。
只要你理解了:数组名该数组的首地址,那么&a[0]就是等价于&a。
追问
我就是不明白啊,数组名是该数组的首地址,那&a是对首地址再取址,就不再是首地址了呀。所以a等价于&a[0]是对的,&a[0]不等价于&a啊。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2012-01-13
展开全部
//3种写法都是正确的。下面是测试程序及运行结果。
#include <stdio.h>
int main()
{
int a[4]={1,2,3,4};
printf("%d\n",*(int *)a);
printf("%d\n",*(int *)(&a[0]));
printf("%d\n",*(int *)(&a));
return 0;
}
//运行结果:
1
1
1
#include <stdio.h>
int main()
{
int a[4]={1,2,3,4};
printf("%d\n",*(int *)a);
printf("%d\n",*(int *)(&a[0]));
printf("%d\n",*(int *)(&a));
return 0;
}
//运行结果:
1
1
1
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
&a代表的不是取a这个变量的地址,而是取数组元素的地址,这样就不难理解了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
赞成queenbelle_的回答,简洁明了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询