簡體   English   中英

在C中創建字符串的方法有什么區別?

[英]What is the difference between the ways to create a string in C?

C語言中這兩種形式的字符串變量有什么區別?

char *string1;
char string2[];

還有其他辦法嗎?

非常感謝你。

char *string1 = "foo";

string1是指向字符串文字的指針(為了參數,它指向存儲在程序的只讀數據段中的一系列字符)。

char string2[] = "foo";

string2是一個包含4個字符的數組。 它用字節'f','o','o',ASCII_NUL初始化。

可能最顯着的區別是,如果你做string1[0] = 'b'; 你得到未定義的行為,因為你試圖修改存儲的表示形式的字符串文字。 如果你做string2[0] = 'b'; 然后你將你的個人字符串修改為“boo”,這很好。

通常, char*類型的變量是指向char的指針。 它通常用於指向NUL終止的字符序列中的第一個字符,在這種情況下,它指向一個字符串。 char[]類型的變量是一個chars數組。 如果它有一個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語法不是有效的,但我使用的定義在函數或文件范圍內,在任何函數之外都是有效的。 無論哪種方式,它們的行為與我所描述的初始化和賦值一樣,但它們的生命周期不同。]

它們在內部表示方式上有所不同,但與程序員的工作方式幾乎相似。

char string2[]; 是一個字符數組,當直接分配時,編譯器將理解它是一個字符集合,使得sizeof()返回數組的大小(而不是字符串)。

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

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

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

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM