指针数组:array of pointers,即用于存储指针的数组,也就是数组元素都是指针
数组指针:a pointer to an array,即指向数组的指针
还要注意的是他们用法的区别,下面举例说明。
int* a[4] 指针数组
表示:数组a中的元素都为int型指针
元素表示:*a[i] *(a[i])是一样的,因为[]优先级高于*
int (*a)[4] 数组指针
表示:指向数组a的指针
元素表示:(*a)[i]
二维数组作为函数参数时,函数名被视为地址,此时形参是一个指针。
例如:
int data [3][4]={ {1,2,3,4},{2,3,4,5}, {3,4,5,6}};
int total=sum (data, 3) ;
data 是一个数组名, 该数组有三个元素, 每个元素本身是一个由4个int 值组成的数组。 因此data 的类型是指向由4个int组成的数组的指针。
sum 函数的原型是:
int sum( int ( * array ) [4], int size) 等价于 int sum( int array[] [4] ,int size)//array 是指针
int (* array) [4] : 声明一个指向由4个int 组成的数组的指针。 该指针指向一个数组,数组的 每个元素是的类型是 int [4], array 即指向数组的指针。
此时将array看成一个二维数组的名称。
array[r][c]= * (* (array+r) +c)
array //指向 array of 4 int 的第一行的指针
array +r //指向 array of 4 int 的第 r 行的指针
*(array+r) // 指向第r 行第 0列的元素的指针, array of 4 int 的第r行,即 一个数组的名字。即第r行的第一个元素的地址。 =array[r]
*(array+r) +c //指向第r 行第 c列的元素的指针
* (* (array+r) +c) // 第r行第c列的元素的值 ==array[r][c]== (*array) [c]
不能声明为
int * array[4]://array 是数组
声明一个由4个指向int 的指针组成的数组。该数组由4个元素构成, 元素的类型是int *, 即指针数组。