簡體   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