书部落-计算机PDF电子书之家 » 学习经验·技术心得·答疑解惑 » C/C++语言学习小组 » 《再再论指针》第二章 再一次吃惊--数组的数组与多维数组的区别


2007-2-25 22:42 shubulo
《再再论指针》第二章 再一次吃惊--数组的数组与多维数组的区别

第二章 再一次吃惊----数组的数组与多维数组的区别 /`'qIUt&S~
        看见这个题目,也许有些人就会嘀咕了:难道两者不是一样的吗?C语言的多维数组不就是数组的数组吗?不!两者是有区别的,而且还不小呢。首先看看两者的共同点:.q'mQ(`f
WFpGhg!zQ
1。内存映象一样。N8Qq0H3?l@T(B
.~3u9YYQ9k?
2。数组引用方式一样,都是“数组名[下标][下标]........”。
)^nVP'EJ L
,? X7i Mr3JtAi 3。数组名都是数组的首地址,都是一个符号地址常量、一个右值。,SI:lF7kc
yCH}-F"jf5Y d*k
5I2Y.|4| Q*f)IK
        由于两者的共同点主要反映在外部表现形式上,因此,从外部看来,数组的数组跟多维数组似乎是一样的,这造成了C程序员对两者的区别长期以来模糊不清。但实际上,c语言限于本身的语言特性,实现的并非真正的多维数组,而是数组的数组。w o.]+p+N
oLM9R }-W
        数组的数组与多维数组的主要区别,就在于数组的数组各维之间的内在关系是一种鲜明的层级关系。上一维把下一维看作下一级数组,也就是数组嵌套。数组引用时需要层层解析,直到最后一维。举个例,对于数组:
t/ZD*Cr&eE2O int a[7][8][9];sp-L+c"\9~#Z
如果要访问元素a[4][5][6],首先就要计算第一维元素4的地址,也就是a+4,由于是数组的数组,元素4的值代表了一个数组,因此元素4的值就是它所代表的那个数组的首地址,我们用一个符号address1代表它,也就是address1=*(a+4),接着计算第二维,显然元素5的地址是address1+5,其值也是一个数组的首地址,用address2表示它,就是address2=*(address1+5),最后一维,由于已经到达了具体的元素,因此这个元素的地址是address2+6,其值*(address2+6)是一个整数,把address1和address2分别代入相应表达式,就成了:
"j kC*S;Up(C L *(*(*(a+4)+5)+6);
#?$y9tPUT#S6w 这就是我们熟知的[]运算符的等价表达式。 t-e d^DU YotZh-O

;l4EN'Q+n E9w         而真正的多维数组并没有这么多“束缚”,相比之下简单得多,由于各维之间不是这种复杂的层级关系,元素a[4][5][6]的偏移量可以这样直接获得:(4x8x9+5x9+6)xsizeof(int),再加上数组的首地址a就是元素a[4][5][6]的地址了。但是,c语言的数组能够这样用首地址加上(4x8x9+5x9+6)xsizeof(int)的形式来访问元素吗?显然是不行的。归根到底就在于C语言的地址数据类型不但有类型,还具有级别。就是这种层级关系造成了C语言只能用数组的数组当作多维数组。如果C语言非得要实现真正的多维数组,那么地址与指针的概念就得重新改写了。

2007-2-28 10:03 jackydi
好文章,保存下来好好看看。

2007-9-12 10:13 红影
楼上的你再发表重复内容的帖子我肯定扣分!!!

2007-10-24 19:12 gtsfreer
论坛用Opera打开看帖子的时候好像一行总的字数过多,是因为Opera不支持么?

2007-10-25 12:29 xianyu
不错啊,值的好好学习!

2007-10-27 09:13 niuyifei2
太好了,,对数组有加深了理解,多谢

2007-11-1 22:54 lovewhzlq
学习学习,:lol :lol

2008-7-25 23:11 GB_juno
晕,其实不就是为了方便思考使用吧。本质上应该是一样的,不过就是加多一个功能而已啊。

2008-7-28 13:11 chxl13
楼主把第一种形式的展开看看

2008-8-5 18:38 galactic
good for me  thanks\
r5QD/x|n(y :)

2008-8-6 13:25 xiaoshu666
这个好像值得思考了%p.U h1|H Z]
_2^C c#tj
做实验看看啊!

2008-9-26 09:08 jyss1644
学习了,谢谢楼主分享。

2008-9-27 14:52 foxclever
我个人认为只是实现方式的不同而已,应用起来没什么?

2008-10-8 09:38 jonah
个人认为的确是由于C的实现方式造成的,C中多维数组在内存中的排列方式造成的

2008-10-19 13:59 kknd47
其实没这么大区别,你用int *aa;aa=&a[0][0][0];然后一样可以用*(aa+i*8*9+j*9+k)取得a[i][j][k]的值,数组的数组只是类型检查严格些.

2008-12-19 02:16 kgdusretg
我最近也在学指针啊,看了这个了明白了不少啊

页: [1]


Powered by Discuz! Archiver 5.0.0  © 2001-2006 Comsenz Inc.