[英]Clarification on why this C code works
我今天正在学习 C。 一段时间以来,我一直在使用托管语言(Java、C#、Python 等)进行编码。 我以为我正在了解指针的详细信息,但后来我编写了以下代码,按预期工作,但生成了“不兼容的指针类型”警告。
void setText(char* output) {
//code to set output to whatever, no problems here.
}
int main(int argc, const char* argv[]) {
char output[10];
setText(&output);
//[EDITED] ...other test code which printf's and further manipulates output.
return 0;
}
所以我用谷歌搜索,最后换了行
setText(&output);
至
setText(output);
这摆脱了警告。 但现在我不知道为什么第一个工作在所有。 据我所知,我正在发送一个地址的地址(因为 char* x; 本质上与 char x[]; 相同)。 我有什么误解,为什么这两种方法都有效?
output
的类型是char [10]
,它在 function 调用的上下文中衰减为char *
(这就是第二个变体起作用的原因)。
&output
的类型是char (*)[10]
,即指向数组的指针。 这不是一回事,因此会发出编译器警告。 但是, &output
(地址)的值等于output
的值(一旦它衰减为char *
),因此最终结果是“如预期的那样”。
这可能听起来像迂腐,但有一个相当重要的区别。 尝试以下操作:
void foo(const char *p)
{
printf("%s\n", p);
}
int main(void)
{
char output[][6] = { "Hello", "world" };
foo(output[0] + 1);
foo(&output[0] + 1);
}
推荐阅读arrays 和指针的 C FAQ 和指针,特别是问题 6.3 和 6.12。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.