C语言指针转置m×n(C语言学习趣事_关于指针转换)
导读:今天在Gmail的群组讨论贴中看到这样一个帖子: [learn-linux-c-cpp] 一维数组转成指向数组的指针 收件箱...
今天在Gmail的群组讨论贴中看到这样一个帖子:
[learn-linux-c-cpp] 一维数组转成指向数组的指针
收件箱
x
zhangzhe benzhemin@gmail.com
11-10-28
发送至 learning-linux.
还请大家讨论一下:
代码:
#include <stdio.h>
int main(void){
int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int (*p)[2] = (int (*)[2])a;
printf("%d\n", **p);
printf("%d\n", **(p+1));
printf("%d\n", *a);
return 0;
}
a只是一个指针 ,为何转成int (*)[2]之后转成了二维指针?
事实上下面代码也可以编译运行通过 。
#include <stdio.h>
int main(void){
int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int (*p)[2] = (int (*)[2])&a;
printf("%d\n", **p);
printf("%d\n", **(p+1));
printf("%d\n", *a);
return 0;
}
难倒 int (*p)[2] = (int (*)[2])a; 和 int (*p)[2] = (int (*)[2])&a;两种转换是等价的吗 。
这里明显可以看到这位网友对概念的混淆 ,如下的描述。
a只是一个指针 ,为何转成int (*)[2]之后转成了二维指针?
我们知道在C语言中 ,数组名是一个常量 ,就是常说的const量 ,经过上面的变化 ,a并没有变成int (*)[2]这样的指针类型 ,它还是保持
原来的属性;只不过是p是int (*)[2]这样的一个指针类型 ,并且被用户强制指向了a这个地址 。这就是说如果用指针p访问的话,那么可以将a地址开始的
10个整数解释成二维数组 。
还有就是下面的这个描述:
难倒 int (*p)[2] = (int (*)[2])a; 和 int (*p)[2] = (int (*)[2])&a;两种转换是等价的吗 。
上面的这两个描述是一致的 , 因为在解析的时候: a 和 &a 的实质是一样的 ,都是指向内存中固定的区域;因此两种转换是等价的 。
这里不多说了,欢迎园子里的大侠们 ,对这个问题进行讨论 。
以上只是我个人的观点 ,如有不当,请大家拍砖.........................
声明:本站所有文章 ,如无特殊说明或标注 ,均为本站原创发布 。任何个人或组织 ,在未征得本站同意时 ,禁止复制 、盗用 、采集、发布本站内容到任何网站 、书籍等各类媒体平台 。如若本站内容侵犯了原著者的合法权益 ,可联系我们进行处理 。
创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!