prev up next   top/contents search

comp.lang.c FAQ 列表· 问题 6.13

Q如何声明一个指向数组的指针?


A通常,您不想这样做。当人们随意谈论指向数组的指针时,他们通常指的是指向其第一个元素的指针。

与其使用指向数组的指针,不如考虑使用指向数组某个元素的指针。类型为 T 的数组会退化为指向类型 T 的指针(请参见问题 6.3),这很方便;对退化后的指针进行下标访问或递增将访问数组的各个成员。真正的指向数组的指针,在进行下标访问或递增时,会跳过整个数组(见下文),并且通常只在操作数组的数组时有用,[脚注] 如果有用的话。(另请参见问题 6.18。)

如果您确实需要声明一个指向整个数组的指针,请使用类似“int (*ap)[N];”这样的声明,其中N是数组的大小。(另请参见问题 1.21。)如果数组大小未知,N原则上可以省略,但由此产生的类型“指向未知大小的数组的指针”是无用的。

这是一个示例,展示了普通指针和指向数组的指针之间的区别。给定声明

int a1[3] = {0, 1, 2};
int a2[2][3] = {{3, 4, 5}, {6, 7, 8}};
int *ip;		/* pointer to int */
int (*ap)[3];		/* pointer to array [3] of int */
您可以使用指向int, 的普通指针ip来访问一维数组:
	ip = a1;
	printf("%d ", *ip);
	ip++;
	printf("%d\n", *ip);
a1
	0 1
此片段将打印对指向数组的指针ap来访问一维数组:
	ap = &a1;
	printf("%d\n", **ap);
	ap++;				/* WRONG */
	printf("%d\n", **ap);		/* undefined */
的尝试使用0将在第一行打印,在第二行打印一些未定义的内容(并可能导致崩溃)。指向数组的指针在访问数组的数组时才可能有用,例如a2:
	ap = a2;
	printf("%d %d\n", (*ap)[0], (*ap)[1]);
	ap++;		/* steps over entire (sub)array */
	printf("%d %d\n", (*ap)[0], (*ap)[1]);
最后这个片段将打印
	3 4
	6 7

另请参见问题 6.12

附加链接: 进一步阅读

参考文献:ISO Sec. 6.2.2.1


prev up next   contents search
关于此 FAQ 列表   关于 Eskimo   搜索   反馈   版权

Eskimo North 托管