这一小节的标题看似是两个类似的概念,其实两者却截然不同。指针作为一种变量类型,自然可以被声明为数组,而数组作为一种变量类型,也可以有指向它的指针。所以指针的数组是一种数组,而数组的指针则是一种指针。接下来我们用一些示例来介绍这两种数据类型。
动手写6.2.10
动手写6.2.10展示了指针的数组和数组的指针。运行结果如图6.2.10所示:
图6.2.10 指针的数组和数组的指针
我们可以看到,数组的指针和指针的数组的语法区别在于:数组的指针需要在星号和变量名外面加一个括号,而指针的数组却没有。这一点其实很好理解,因为声明数组的时候元素类型名int和数组大小[5]就是被变量名隔开的,在这里我们添加一个星号,并用括号括起来,表示这个指针int (*arrPtr)[5]是指向整个数组的;如果不加括号,编译器就只会将星号联系到前面的类型名int,所以ptrArr就只是声明了一个数组,数组的元素类型是int*。
在声明arrPtr的时候,我们把数组的地址赋值给它作为初值,由于数组的指针解引用以后就相当于数组,我们可以用( *arrPtr )[i]来读取数组的元素。
ptrArr是一个指针的数组,它的每一个元素都是一个指针,在这里我们就将数组每个元素的地址分别赋值,而在遍历的时候我们使用*( ptrArr[i] ) 来读取数组中某一个指针指向的元素值。(www.xing528.com)
这里比较不直观的一点是arrPtr和*arrPtr代表的地址完全一样。为了解释这一点,我们再看一个示例:
动手写6.2.11
动手写6.2.11展示了数组的指针的地址问题,运行结果如图6.2.11所示:
图6.2.11 数组的指针的地址
我们可以看到,数组的指针必须指向相同大小的数组,如果arr2只有4个元素,第十四行的赋值就会产生编译错误;并且由于数组的指针指向是不可修改的数组,我们不能把*arrPtr作为左值修改。
至于为什么arrPtr和*arrPtr的地址一样,我们可以看作是编译器不得已的安排。我们知道,数组名arr1代表着数组首元素的地址,而一般的变量比如int1就放着一个数值,而&int1才放着int1的地址。由于数组的这一特殊性,导致了&arr得到的数组地址与arr代表的数组地址是一样的,因此相应的arrPtr和*arrPtr的地址也只能是一样的,*arrPtr也要搭配下标操作符才能取得数组的具体元素。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。