我今天正在学习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 [];本质上是相同的)。我误解了什么,为什么这两个都有效?
答案 0 :(得分:17)
output
的类型是char [10]
,它在函数调用的上下文中衰减为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);
}
推荐阅读为the C FAQ on arrays and pointers,特别是问题6.3和6.12。