2011-07-03 41 views
7

今天我在學習C語言。我一直在使用託管語言(Java,C#,Python等)進行編碼。我以爲我瞭解指針的細節,但後來我寫了下面的代碼,按預期工作,但生成了「不兼容的指針類型」警告。澄清爲什麼此C代碼工作

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

很難告訴你爲什麼'setText'沒有看到它的實現而工作。儘管如果所有的'setText'都設置了一個變量,然後程序退出,那麼如何判斷程序是否按照你想要的來執行? – jwodder

+2

'T *'不*與* T [K]相同。見例如http://c-faq.com/~scs/cgi-bin/faqcat.cgi?sec=aryptr – delnan

+0

@delnan:鏈接似乎中斷 – Cameron

回答

17

類型的outputchar [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。

+1

儘管有警告,但它「起作用」,因爲它們最終指向同一個地方。 –

+1

不錯的例子。這真的有助於說明這裏實際發生的事情。 – hbw

+0

是的,這個例子確實有幫助。謝謝。 – atheaos