关于二维数组名

对于a[3][2],a与a[0]指向a[0][0]对吧,可书上说求a[0][2]的地址用*(a+0)+2,事实也可以求出正确结果,可是分析上式,*(a+0)为a[0][0],a[0][0]唯一存储单元,加上一个2得到a[0][2]的地址?如何理解? 我认为a是指向a[0]的而不是指向a[0][0],如果这样理解,*(a+0)就指向了a[0],而a[0]为地址,加2便指向了a[0][2],如果这样理解但是printf("%p %p %p",a,a[0],&a);输出的结果是一样的,怎么理解; 还有数组名如不占内存的话,所谓的标签怎么理解。

自己琢磨吧,应该能想的通。自己理解了才是自己的。

还有,不管是几维数组,它在内存中的存储地址都是连续的。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-10-05
同学你好:
我看了你的问题,是这样的,a[3][2],你关于“a与a[0]指向a[0][0]对吧”的理解是不对的,后面的理解是正确的,不要怀疑自己。标签只是个记号,不占内存。
二维数组实际上就是一个数组元素为以为数组的一维数组,简单的说就是,一个以为数组中的
元素是一个以为数组,所以,例如:a【3】【2】,a表示 a 这个一维数组 a[i] 的地址,同样的道理 (a[i]) 为二位数组a[i][j]; 的地址,那么我们访问一维a[0]<=>*(a+0), a[1] <=> *(a+1);
同理,二位数组的访问也是这样只不过二位数组的地址变成了 a[i];所以我们访问时
a[1][2] <=> *(a[1] +2) <=> (*(a+1) + 2)

希望你能采纳本回答被提问者和网友采纳
第2个回答  2012-10-05
对于二维数组a[3][2],有人将a,a[0],a[0][0]这三者的关系用排长连长班长的关系来理解很不错具体的细节你可以在网上搜一下,很多的,在这里a[0],a,a[0][0]确实都表示的是a[0][0],不过有些区别,用a来表示是把a[3][2]当作一个一位数组来看待,其元素分别为a[0],a[1],所以a+0表示指向a[0](这里的a[0]仍然是被当作一位数组a的一个元素,而不是一个数组)所以(a+0)+2是指向一维数组a[0]的第三个元素a[0][2]的,在对其取内容*,所以*(a+0)+2就是表示a[0][2]了,你说的*(a+0)为a[0][0]是错误的,因为a为二维数组名a+0表示的是a[0]的地址,而*(a+0)就是取了a[0]的地址,不信你可以上机调试一下
相似回答