返回首页   进站必读

15.3 数组指针的使用


15.3 数组指针的使用

现在看指向数组的指针如何使用:

    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就像一个二维数组的名字,它表示什么含义呢?下面把pa和二维数组放在一起做个分析。

int a[5][10];和int (*pa)[10];之间的关系同样类似于int a[10];和int *pa;之间的关系:a是由一种元素组成的数组,pa则是指向这种元素的指针。所以,如果pa指向a的首元素:

    int a[5][10];
    int (*pa)[10] = &a[0];

则pa[0]和a[0]取的是同一个元素,唯一比原来复杂的地方在于这个元素是由10个int组成的数组,而不是基本类型。这样,我们可以把pa当成二维数组名来使用,pa[1][2]和a[1][2]取的也是同一个元素,而且pa比a用起来更灵活,数组名不支持赋值、自增等运算,而指针可以支持,pa++使pa跳过二维数组的一行(40个字节),指向a1的首地址。

#include <stdio.h>

#define LEN 100

int main(void)
{
	int i;
	typedef char (*a_t)[LEN];
	a_t p;
	char buf[LEN][LEN]= {"a","b","c","d","abcd"};
	p = &buf[0];

	for(i=0; i<5; i++){	
#if 0
		buf++;
		printf("%s\n",buf);
#else
		printf("%s\n",*p);
		p++;
#endif
	}

	return 0;
}