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