免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: wuexp

[C] 关于char数组与int数组的区别的疑问 [复制链接]

论坛徽章:
0
发表于 2009-11-14 14:17 |显示全部楼层
找到一篇类似问题的帖子。我在回味回味。
现在,我还是对数组a 和&a的指针相等有点疑惑。
http://bbs.chinaunix.net/viewthread.php?tid=968541
在上边的那个帖子里“对&操作符的理解是:它不只是简单的取得它之后的变量的地址而已,其实它也产生一个指针常量”这句话对我启发很大。

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
发表于 2009-11-17 02:02 |显示全部楼层

回复 #11 wuexp 的帖子

假设i386上。

int* p = 0; 的布局是:
address of p: [0] , [0] , [0], [0]

int a[2] = {0}; 的布局是:
address of a :
[0],[0],[0],[0]; [0],[0],[0],[0] ;

指针占据4字节。
数组名,可以认为数组名不占空间,也可以认为数组名拥有整个数组的空间。


编译器不进行优化的情况下,通过指针访问元素: p[ i ]
需要首先从指针的地址address of p上的4个字节,得到指针的值 —— 数组的地址。
再根据指针的类型计算偏移 void* pe = (char*)p + sizeof(*p) * i。
然后访问: *(int*)pe

通过数组名访问元素: a[ i ]
少一个访问过程,address of a就是数组的地址。
下面的过程和指针相同。

所谓的数组退化为指针, 就是将address of a 的值,保存到一个指针变量中。


综上:
a, &a[0]的值是相同的, 都是 address of a。





要解释为什么 &a的值也是address of a 嘛……

int i = 0; 布局:
address of i : [0],[0],[0],[0];
&i 得到的就是 address of i。

T v; 布局 :
address of v : [??],[??], ...
&v 得到的也是address of v

对变量(或者object)取值,得到的地址,也可以理解为一个大小为1的数组的首元素的地址。

int a[2]; 可以理解为一个变量,一个数组变量。
对a取值, 得到的是这个变量的地址 —— address of a。 所以和 a, &a[0]是相同的。

这个地址又可以理解为一个大小为1的数组的首元素地址,该数组元素类型是int [2], 如果+1, 偏移就是sizeof( int[2] )。

这样可能会清晰一些:
typedef int iarr2[2];
iarr2 a;
iarr2* p = &a;
p[ i ] 是  (iarr2*)( (char*)p + sizeof(iarr2) * i )



其实我是通过汇编代码才真正了解指针和数组名的区别的。
要想不通过汇编就理解这2者的区别, 多少有点过于抽象……
写过一个 指针/数组 & 声明/定义 4种组合都不会错的程序 —— 不涉及汇编 —— 应该对非汇编理解这个问题有帮助。
不过不知道丢哪去了…… 我找找看……
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP