2009-09-19 82 views

回答

10

char *string1 = "foo";

字符串1是一個指向字符串文字(對於參數的緣故,它指向存儲在程序的只讀數據段中的一系列字符)。

char string2[] = "foo";

字符串2是4個字符陣列。它用字節'f','o','o',ASCII_NUL進行初始化。

也許最重要的區別是,如果你做string1[0] = 'b';你會得到未定義的行爲,因爲你試圖修改存儲的表示字符串文字。如果你做string2[0] = 'b';那麼你修改你的個人字符串爲「噓」,這很好。

通常,char*類型的變量是指向char的指針。它通常用於指向以NUL結尾的字符序列中的第一個字符,在這種情況下,它指向一個字符串。 char[]類型的變量是一個字符數組。如果它有一個NUL終結符,那麼它實際上是一個字符串。

問題稍微由兩個事實困惑:

1)在C中,每當一個數組變量名是在採用一個指針的上下文中,它「是指」一個指針到所述陣列的所述第一元件。所以數組和指針通常被認爲是可以互換的。

2)在C中,類型char[]的函數參數是而不是實際上是一個數組。它只是一個指針,與char*完全一樣。所以,數組和指針經常被認爲是可以互換的。

所以,指針和數組的另一個區別:

string1 = "bar"; // changes string1 to point to another string literal. 

string1 = string2; // changes string1 to point to the first character of string2. 

string2 = string1; // doesn't compile - you can't assign to an array, 
        // only initialize it and then modify element-by-element. 

[注:問題的聲明char string2[];不在功能有效C語法,但我已經使用的定義將是有效的無論是在函數中還是在文件範圍內,在任何函數之外。無論哪種方式,他們的行爲,我已經描述了初始化和分配,但他們有不同的生命週期。]

0

1)* char string1;是指向(可能)字符串的指針,而

2)char string2 [];更明確的一點是有意指向一個數組

無論哪種方式,你仍然需要分配內存來保存上述字符串。從優雅的角度來看,我會選擇#2。

3

他們在內部表示的方式不同,但幾乎相似的程序員的工作方式。

雖然char string2[];是一個字符數組,但直接賦值時,編譯器會理解它是一個字符集合,使sizeof()返回數組的大小(而不是字符串)。

char *string1是指向字符串中第一個字符的指針。它不包含有關它保存的編譯時間信息,並且在使用sizeof查詢時將返回指針的大小(32位爲4,64位爲8)。指針擁有內置的operator[](可在C++中重寫),使它們充當數組。

指針更靈活,可以更改爲指向的內容,而數組則不能。您可以填充數組的唯一方法是使用strcpy,memcpy或類似的手動副本。指針可以自由分配到任何內存位置的第一個和第N個元素,以便在內容上具有更大的靈活性。

相關問題