2013-09-28 36 views
1

爲什麼我不能更改char *指向的內容?
例如:如何在將char *傳遞給C中的函數後指向期望的char數組?

int main(int argc, char * argv[]) { 
    char *a = NULL; // now a = NULL 
    b(a); 
    // but now a points to NULL again! Why? 
} 

void b(char *argv[], char* c) { 
    // now a is passed in 
    c = *argv[3]; 
    // now a actually points to the start of char array pointed to by argv[3] 
} 

從輸出中,我看到了一個*傳遞給函數。然後在函數b中,它實際上指向了期望的char []。但是當從b返回時,a再次變爲NULL。爲什麼? a從b返回後如何指向期望的內容?謝謝!

+0

這只是大量的錯誤C,你不應該感到驚訝,它表現得異乎尋常。聲明一個正確的函數原型,它將無法編譯,就像你期望和希望的那樣。 –

+0

我無法弄清楚你在這個例子中要做什麼。請閱讀C的基礎知識。 – shunyo

回答

2

C按值傳遞所有內容,包括指針。函數參數類似於從調用者獲取其初始值的局部變量。一旦進入函數,參數的值就可以自由更改,而不會影響調用者傳遞的值。

C將可修改的東西傳遞給函數的方法是傳遞指針。如果您想修改某種類型的值T,則將指針傳遞給T;如果要修改指向T的指針,則必須將指針傳遞給指向T的指針,依此類推。換句話說,間接水平必須比被改變的值高一。

這是如何適用於您的情況?你的功能b需要修改一個指向char,因此它需要採取一個指針指向一個字符,像這樣:

功能
void b(char *argv[], char **ppc) { 
    ... 
} 

裏面你修改指針到ppc點提領ppc一次:

*ppc = argv[3]; // No asterisk here in front of `argv` 

過程調用從main需求b採取a地址,像這樣:

b(argv, &a); 
相關問題