本帖最后由 韩山童 于 2017-1-16 10:15 编辑
数组名本质上是一个指针(常量指针)。我们举例说明
1. int b[5]={1,2,3,4,5};那么b与*(b+i)等价,其中i=0~4。数组名b代表数组本身,它的类型是int[5]。如果将数组名b当做指针来看,则b的类型是int*,指向的类型是int。即上面说的b与*(b+i)等价。需要注意的是,当将数组名b当做指针来看的时候,这个数组名占据独立的内存单元,即指针占据的内存与数组第一个元素的内存单元不一样。另外需要注意的是,尽管我们可以将数组名当做指针来看,但是当将sizeof作用于数组名时,即sizeof(b),返回的结果是整个数组所占据总字节数,而不是指针所占据的4/8个字节。
2. 如果是二维数组呢:int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};,我们可以认为a是一个包含三个元素的一维数组,每一个元素又是一个一维数组,比如a[0]表示的是{1,2,3,4},以此类推。其中我们已经知道了一维数组的情况了。现在讨论:如果将二维数组的名字当做指针来看,会是什么样子?如果a是一个指针,那么它的类型是int(*)[4],它指向的类型是int[4],也就是说a当做指针看待时,它指向的是一个含有4个元素的一维数组int[4],那么a+2表示的是指向第三个数组元素的指针,即指向{9,10,11,12}的指针,那么*(a+2)就表示{9,10,11,12}本身。*(a+2)又是个一维数组,所以*(a+2)+3表示的是指向一维数组{9,10,11,12}第三个元素的指针,那么*(*(a+2)+3)就是12。
可能讲二维数组的时候有点绕,但是只要真正弄懂一维数组了,那么理解多维数组就简单了,因为本质上多维数组可以看做一维数组。而且内存中,多维数组的存储形式和一维数组是一样的。谢谢大家!希望各位大神批评指正! |