指向数组的指针与多维数组
指向数组的指针
以下定义一个指向数组的指针,该数组有10个int元素:
int (*a)[10];
[]比*有更高的优先级,如果a先和*结合则表示a是一个指针,如果a先和[]结合则表示a是一个数组。 int *a[10];这个定义可以拆成两句:
typedef int *t;
t a[10];
t代表int *类型, a则是由这种类型的元素组成的数组。 int (*a)[10];这个定义也可以拆成两句:
typedef int t[10];
t *a;
t代表由10个int组成的数组类型, a则是指向这种类型的指针。
现在看指向数组的指针如何使用:
int a[10];
int (*pa)[10] = &a;
a是一个数组,在&a这个表达式中,数组名做左值,取整个数组的首地址赋给指针pa。注意,&a[0]表示数组a的首元素的首地址,而&a表示数组a的首地址,显然这两个地址的数值相同,但这两个表达式的类型是两种不同的指针类型,前者的类型是int *,而后者的类型是int(*)[10]。 *pa就表示pa所指向的数组a,所以取数组的a[0]元素可以用表达式(*pa)[0]。注意到*pa可以写成pa[0],所以(*pa)[0]这个表达式也可以改写成pa[0][0], pa就像一个二维数组的名字。
指向数组的指针和多维数组
int a[5][10];和int (*pa)[10];之间的关系 :
int a[5][10];
int (*pa)[10] = &a[0];
pa比a用起来更灵活,数组名不支持赋值、自增等运算,而指针可以支持, pa++使pa跳过二维数组的一行,指向a[1]的首地址。