[c/c++ 深入探讨数组内存模型]答‘杨建伟 ’网友问

问题:


看了大哥在CSDN中关于<<几个C++的基本问题,研究了两天了,没搞定,汗啊 >>的回复,对于其中的例子一点点小地方,觉得有点疑问,在此请教:
对于int array2d[3][10],系统分配了4*(10*3)bytes的连续空间,注意,两者的内存模型完全一样,只是可用的长度不同而已,只要找到这两个连续的空间的头位置,就可以根据偏移来访问任何一个元素,不管是几维的数组,并且,数组名永远指代连续空间的头地址,于是,我们定义
.......
array[x]=*(p+x);
/ 同样,
int* p=array2d;
*p==array[0][0];
*(p+1)==array[0][1];

对于上面的int* p=array2d; 这一句,我在VC6.0下编译不能通过,提示信息:
'initializing' : cannot convert from 'int [3][4]' to 'int *'

其实我的理解和大哥是一样,也认为这个数组名代表了数组首地址,根据地址可以进行后面的操作。后来尝试把它改为int* p=&array2d[0][0];就能通过编译并运行。
对于一维数组的&a[0]和a是等价的,为什么二维数组就不同呢?不知道大哥对此是如何理解的?
应该不会是我的编译器出问题不能通过编译吧?
祝好!

回答:


关于你的问题,我想告诉你,你得到的错误是正常的,因为,编译程序进行编译的时候,是要进行语义检查的,对编译器来说,数组的数组名和指针在语言的语义层面上是不同的,关于他们的不同,请考虑下面两个语句的区别
int *p1[10];
int (*p2)[10];//注意,第一个定义的一个数组,而第二个定义了一个指针。
 
但是,就像我前面的文章中说得那样,如果我们能理解他的内存结构的话,那么我们可以跳开那很烦人的语义理解,而直接进行高效的内存地址操作的话,将是非常便利的。关于你的问题,想要解决的话,请用强制类型转化解决问题,
int* p=(int *)array2d;//C语言形式
int* p=static_cast<int *>(array2d);//C++语言形式
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值