C++指针数组与数组指针

指针数组

指针数组是一个数组,但数组的数组名可以看成是指向数组第0号单元的指针,所以就多了一层关系,这里面有2个指针,

例1:

int* ptr[3];    //定义了一个指针数组

这个数组里的单元储存了int*的元素,即指向int类型的指针,而指针数组里的指针就是指这个指针,然后把数组名ptr看成指针,则ptr指向这个数组的第0号单元,而这个第0号单元储存的元素类型正是int*类型,这个元素指向int类型。

 

*ptr;   // 对ptr解引用得到的是储存在这个数组第0号单元的元素,得到一个int*类型,等同于ptr[0]
**ptr; //则是对第0号单元元素解引用,得到一个int类型,等同于*(ptr[0])

当然上面的步骤你得初始化后才能进行,如果数组第0号单元内的指针储存了一个变量值为0的地址,则 **ptr = 0;

对于*ptr,对ptr解引用的结果仍是指针,所以可以进行算术操作 *ptr+1,即指向这个数组的下一个单元

 

数组指针

数组指针是一个指针,这个指针指向了一个数组。

例2:

int (*ptr)[3];    //定义了一个数组指针

和指针数组不同,ptr的含义就是“数组指针”中的指针。ptr是int (*)[3]类型,ptr指向的类型是int [3],那么对于数组指针该如何初始化呢?我们用一个数组的首地址来初始化它,如

int arr[3] = {1,2,3};
ptr = &arr;
ptr;      //是int (*)[3]类型
*ptr;     //是int [3]类型
&arr;     //是int (*)[3]类型

最后的结果是ptr指向arr数组(也可以说是指针),arr指向数组的第0号单元。**ptr = 1。*ptr的结果是一个数组。当然你不能尝试将数组赋值给数组,这是不允许的。

*ptr = arr;    //error    *ptr是一个数组类型

 

为什么不能将数组赋值给另一个数组


数组名代表了存放该数组的那块内存,它是这块内存的首地址。这就说明了数组名是一个地址,而且,还是一个不可修改的常量,完整地说,就是一个地址常量。数组名跟枚举常量一样,都属于符号常量。数组名这个符号,就代表了那块内存的首地址。注意了!不是数组名这个符号的值是那块内存的首地址,而是数组名这个符号本身就代表了首地址这个地址值,它就是这个地址。这就是数组名属于符号常量的意义所在。由于数组名是一种符号常量,它是一个右值,而指针,作为变量,却是一个左值,一个右值永远都不是左值,那么,数组名永远都不会是指针!

posted @ 2014-07-14 18:50  demos1995  阅读(917)  评论(0编辑  收藏  举报