回答
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語法,但我已經使用的定義將是有效的無論是在函數中還是在文件範圍內,在任何函數之外。無論哪種方式,他們的行爲,我已經描述了初始化和分配,但他們有不同的生命週期。]
1)* char string1;是指向(可能)字符串的指針,而
2)char string2 [];更明確的一點是有意指向一個數組
無論哪種方式,你仍然需要分配內存來保存上述字符串。從優雅的角度來看,我會選擇#2。
他們在內部表示的方式不同,但幾乎相似的程序員的工作方式。
雖然char string2[];
是一個字符數組,但直接賦值時,編譯器會理解它是一個字符集合,使sizeof()返回數組的大小(而不是字符串)。
char *string1
是指向字符串中第一個字符的指針。它不包含有關它保存的編譯時間信息,並且在使用sizeof查詢時將返回指針的大小(32位爲4,64位爲8)。指針擁有內置的operator[]
(可在C++中重寫),使它們充當數組。
指針更靈活,可以更改爲指向的內容,而數組則不能。您可以填充數組的唯一方法是使用strcpy,memcpy或類似的手動副本。指針可以自由分配到任何內存位置的第一個和第N個元素,以便在內容上具有更大的靈活性。
- 1. C字符串和C++字符串有什麼區別?
- 2. 在C#中的區別是什麼:字符串VS字符串
- 3. 在C#中賦值和創建字符串實例有什麼區別?
- 4. 分配和創建實例的字符串有什麼區別?
- 5. 這兩種方法在Objective-C中創建財產有什麼區別?C
- 6. 在DBIx :: Class中填充和創建方法有什麼區別?
- 7. 兩個字符串有什麼區別?
- 8. 在PHP中創建字符串時,「和」之間有什麼區別?
- 9. C++中字符串初始化有什麼區別?
- 10. 字符串和字符串有什麼區別?
- 11. 這些方法處理Python中的Unicode字符串有什麼區別?
- 12. Ruby中的字符串和符號有什麼區別?
- 13. Ruby中的字符串和符號有什麼區別?
- 14. C中的字符串和ASCII字符串有區別嗎?
- 15. 創建和新建有什麼區別?
- 16. JavaScript Object創建方法有什麼區別?
- 17. %和,在一個字符串中有什麼區別?
- 18. 在java中使用這些字符串有什麼區別嗎?
- 19. 這些PHP字符串插值語法有什麼區別
- 20. C#,Visual Basic.NET和託管C++之間的字符串文字有什麼區別?
- 21. 在C中的字符串常量和字符串文字之間有什麼區別?
- 22. 方法VS物業在C#中 - 有什麼區別
- 23. PHP數組中的這兩個字符串有什麼區別?
- 24. 爲什麼有許多方法可以在Ruby中創建字符串?
- 25. 算法和方法有什麼區別
- 26. 數據存儲類別與字符串:有什麼區別?
- 27. 函數/方法與目標c或Swift中的區別有什麼區別
- 28. 將數組引用方法與字符串之間有什麼區別?
- 29. 在Android OS或Java中,字符序列和字符串有什麼區別?
- 30. C#中的字符串和字符串之間有什麼區別像Java中的int和Integer嗎?