这个问题要问那些 C 大师:
在 C 语言中,可以像下面这样声明一个指针:
char (* p)[10];
..基本上就是说这个指针指向一个包含10个字符的数组。像这样声明一个指针的好处是,如果试图将一个不同大小的数组的指针赋值给 p,就会得到一个编译时错误。如果您试图将一个简单的字符指针的值赋给 p,它也会给您一个编译时错误。我在 gcc 中尝试过这种方法,它似乎适用于 ANSI、 C89和 C99。
在我看来,像这样声明一个指针是非常有用的——特别是当传递一个指向函数的指针时。通常,人们会编写这样一个函数的原型:
void foo(char * p, int plen);
如果您期望一个特定大小的缓冲区,那么只需测试 plen 的值。但是,不能保证传递 p 给您的人真的会在该缓冲区中为您提供充足的有效内存位置。您必须相信调用这个函数的人正在做正确的事情。另一方面:
void foo(char (*p)[10]);
. . 会强迫调用者给你一个指定大小的缓冲区。
这似乎非常有用,但我从未见过任何代码中像这样声明的指针。
我的问题是: 为什么人们不像这样声明指针呢?我没看出什么明显的陷阱吗?