繁体   English   中英

澄清为什么这个 C 代码有效

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM