回答
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#中。字符串和字符串有什麼區別?
- 2. C字符串和C++字符串有什麼區別?
- 3. 在C#中的區別是什麼:字符串VS字符串
- 4. 在C#中賦值和創建字符串實例有什麼區別?
- 5. 分配和創建實例的字符串有什麼區別?
- 6. 這兩種方法在C中獲取字符串輸入有什麼區別?
- 7. golang中的[]字符串和...字符串有什麼區別?
- 8. 這兩種方法在Objective-C中創建財產有什麼區別?C
- 9. 在DBIx :: Class中填充和創建方法有什麼區別?
- 10. char []和C++中的字符串有什麼區別?
- 11. 兩個字符串有什麼區別?
- 12. 字符串,CString,QString有什麼區別?
- 13. 在PHP中創建字符串時,「和」之間有什麼區別?
- 14. 字符串和Javascript中的字符數組有什麼區別?
- 15. R中的字符串和字符有什麼區別?
- 16. C++中字符串初始化有什麼區別?
- 17. 字符串和字符串有什麼區別?
- 18. COM字符串(BSTR)和.NET字符串有什麼區別?
- 19. 創建對象的方法有什麼區別?
- 20. 這些方法處理Python中的Unicode字符串有什麼區別?
- 21. Ruby中的字符串和符號有什麼區別?
- 22. Ruby中的字符串和符號有什麼區別?
- 23. Ruby中的String.new與字符串文字有什麼區別?
- 24. C中的字符串和ASCII字符串有區別嗎?
- 25. 創建和新建有什麼區別?
- 26. 在.NET中字符串實習和字符串合併有什麼區別?
- 27. 創建片段與工廠方法和Fragment.instantiate有什麼區別?
- 28. JavaScript Object創建方法有什麼區別?
- 29. %和,在一個字符串中有什麼區別?
- 30. 在java中使用這些字符串有什麼區別嗎?