[有人质疑了这句话,“如果你真的需要声明一个指向整个数组的指针,可以使用类似 int (*ap)[N]; 的东西。” 这是我的回复。]

发件人:scs@eskimo.com (Steve Summit)
主题:回复:关于6.13的回答的问题
日期:周一,2002年3月25日 23:17:44 -0500
消息ID:<2002Mar25.2317.scs.001@aeroroot.scs.ndip.eskimo.net>

你写道
> 我对c-faq的第6.13题的答案中陈述的某些内容感到困惑
> c-faq的第6.13题的答案
>
> “如果你真的需要声明一个指向整个数组的指针,
> 使用类似下面的东西int (*ap)[N];其中N
> 数组的大小。”
>
> 不是(int (*ap)[n])意思是“指向int的指针数组”吗?int''?

不是!

> 如果不是,为什么以及如何声明一个指向int的指针数组呢?
> int的指针数组,然后。

那很简单

	int *ap[N];
区别在于括号。在C语言中,声明也有优先级关系,当默认优先级不是你想要的,你可以使用显式括号来覆盖它。

为了非常清楚地了解它是如何工作的,我们首先看看表达式中的两个例子,一个简单,一个稍微复杂。

当你写

	x = 1 + 2 * 3;
这是如何解释的?乘法的优先级高于加法,所以2乘以3,结果加到1。如果你想让1加到2,然后乘以3,你需要使用括号

	x = (1 + 2) * 3;
当你写

	int a[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
	int *ip = &a[5];

	x = *ip++;

这是如何解释的? 是指*ip++意味着跟随指针(即,获取指向的内容)ip并递增它指向的内容,或者递增指针ip并且(因为这是后增量形式)获取它曾经指向的内容?后缀++的优先级高于一元前缀*,所以解释是指针被递增 --x被设置为5,并且ip最终指向a[6]。 如果你想递增指向的位置,你需要再次使用显式括号来覆盖默认优先级:说

	x = (*ip)++;
设置x到5,并留下ip指向a[5],并递增a[5]以包含6。

(这可能不是最好的例子,因为你可能很难看到x在这两种情况下都被设置为5,而不是6。相信我,确实是这样。 后缀++意味着被递增的事物的“旧”值总是被使用,无论被递增的事物是指针ip或指向的数组元素a[5].)

最后,让我们看看声明。如果你写

	 int *ap[10];
你是声明一个指针数组,还是一个指向数组的指针?在声明中,括号[]描述数组的优先级高于*描述指针的。看起来像*[]都在标识符ap旁边,但是由于[]的优先级更高,这意味着括号更“接近” --ap首先是一个数组,它是一个指针数组。 如果你真的想要一个指向数组的指针(虽然通常你不需要),你再次使用显式括号来覆盖默认优先级

	 int (*pa)[10];
pa首先是一个指针,它是一个指向数组的指针。

幸运的是(这不是偶然),指向数组的指针比指针数组要罕见得多,因此自然语法(没有括号)几乎总是你想要的。(除了 FAQ 列表中的例子,我不确定在我所有的 C 编程生涯中,我是否使用过指向数组的指针。)