【发布时间】:2018-09-18 22:12:21
【问题描述】:
我以为我了解 C 数组、指针和指向数组的指针是如何工作的,但现在我偶然发现了一段我不明白的工作代码:
int sum(const int * const buf, int len)
{
int result = 0;
const int (*p)[];
int n;
p = (const int(*)[]) buf;
// p = buf without cast gives compiler warning here (but works)
// p = (const int(*)[]) &buf; // Doesn't work! Segfault!
for( n=0; n<len; n++)
{
result += (*p)[n];
}
return result;
}
这确实有效。但是怎么做?问题是:从“buf”到“p”的分配是如何工作的?我认为 p 的这个声明类似于“指向 int 的指针的指针”,所以我希望在分配时需要一个“&”。为什么这不是必需的?
实际上下面的原型也可以工作(与上面相同的函数体):
int sum(const int buf[const], int len)
现在看起来更加清楚的是,与“buf”的声明相比,“p”的声明增加了一级指针重定向。仍然......分配工作正常,无需任何“&”。谁能解释一下?
【问题讨论】:
-
sum怎么叫?
-
在你的例子中,'p' 变成了一个指向整数数组的指针,知道这个奥斯卡应该更有意义。
-
@Lundin:是的,我应该仔细看看,你是对的。我删除了我的 cmets。
-
我在问题中添加了“语言律师”标签。当您对不一定具有实际生产质量的代码有疑问时,此标记很有用,但当您仍想知道行之间发生了什么时。
-
请不要再磕磕绊绊了。你被很多垃圾绊倒了:(
标签: c syntax language-lawyer declaration c99