指针数组
指针数组是一个数组,但数组的数组名可以看成是指向数组第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是一个数组类型
为什么不能将数组赋值给另一个数组
数组名代表了存放该数组的那块内存,它是这块内存的首地址。这就说明了数组名是一个地址,而且,还是一个不可修改的常量,完整地说,就是一个地址常量。数组名跟枚举常量一样,都属于符号常量。数组名这个符号,就代表了那块内存的首地址。注意了!不是数组名这个符号的值是那块内存的首地址,而是数组名这个符号本身就代表了首地址这个地址值,它就是这个地址。这就是数组名属于符号常量的意义所在。由于数组名是一种符号常量,它是一个右值,而指针,作为变量,却是一个左值,一个右值永远都不是左值,那么,数组名永远都不会是指针!