[有人质疑了这句话,“如果你真的需要声明一个指向整个数组的指针,可以使用类似 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 编程生涯中,我是否使用过指向数组的指针。)