第十一章 字串和字串函式

2021-09-24 21:01:46 字數 2304 閱讀 3577

github位址,歡迎 star

字串是以空字元(\0)結尾的 char 型別陣列。

1、字串字面量(字串常量

用雙引號括起來的內容稱為字串字面量(string literal),也叫作字串常量(string constant)。雙引號中的字元和編譯器自動加入末尾的 \0 字元,都作為字串儲存在記憶體中。

字串常量屬於靜態儲存類別(static storage class),這說明如果在函式中使用字串常量,該字串只會被儲存一次,在整個程式的生命期內存在,即使函式被呼叫多次。用雙引號括起來的內容被視為指向該字串儲存位置的指標。這類似於把陣列名作為該陣列位置的指標。

2、字串陣列和初始化

注意最後的空字元。沒有這個空字元,這就不是乙個字串,而是乙個字元陣列。

在指定陣列大小時,要確保陣列的元素個數至少比字串長度多 1(為了容納空字元)。所有未被使用的元素都被自動初始化為 0(這裡的 0 指的是 char 形式的空字元,不是數字字元 0)。

3、陣列和指標

陣列形式(ar1)在計算機的記憶體中分配為乙個內含 29 也元素的陣列(每個元素對應乙個字元,還加上乙個末尾的空字元 『\0』),每個元素被初始化為字串字面量對應的字元。通常,字串都作為可執行檔案的一部分儲存在資料段中。當把程式載入記憶體時,也載入了程式中的字串。字串儲存在靜態儲存區(static memory)中。但是,程式在開始執行時才會為該陣列分配記憶體。此時,才將字串拷貝到陣列中。注意,此時字串有兩個副本。乙個是在靜態記憶體中的字串字面量,另乙個是儲存在 ar1 陣列中的字串。

伺候,編譯器便把陣列名 ar1 識別為該陣列首元素位址(&ar1[0])的別名。這裡關鍵要理解,在數值形式中,ar1 是位址常量。不能更改 ar1,如果改變了 ar1,則意味著改變了陣列的儲存位置(即位址)。可以進行類似 ar1 + 1 這樣的操作,標識陣列的下乙個元素。但是不允許進行 ++ar1 這樣的操作。遞增運算子只能用於變數名前(或概括地說,只能用於可修改的左值)不能用於常量。

指標形式(*pt1)也使得編譯器為字串在靜態儲存區預留 29 個元素的空間。另外,一旦開始執行程式,它會為指標變數 pt1 留出乙個儲存位置,並把字串的位址儲存在指標變數中。該變數最初執行該字串的首字元,但是它的值可以改變。因此,可以使用遞增運算子。

字串字面量被視為 const 資料。由於 pt1 執行這個 const 資料,所以應該把 pt1 宣告為指向 const 資料的指標。這意味著不能用 pt1 改變它所指向的資料,但是仍然可以改變 pt1 的值。如果把乙個字串字面量拷貝給乙個陣列,就可以隨意改變資料,除非把陣列生命為 const。

總之,初始化陣列把靜態儲存區的字串拷貝到陣列中,而初始化指標只把字串的位址拷貝給指標。如下程式清單。

/** 字串位址 */

#include #define msg "i'm special"

int main()

下面是在我們的系統中執行該程式後的輸出:

address of 「i』m special」: 00403178

address ar: 0060fef0

address pt: 00403178

address of msg: 00403178

address of 「i』m special」: 00403178

該程式的輸出說明了什麼?第一,pt 和 msg 的位址相同,而 ar 的位址不同,這與我們前面討論的內容一致。第二,雖然字串字面量 「i』m special」 在程式的兩個 printf() 函式**現了兩次,但是編譯器只使用了乙個儲存位置,而且與 msg 的位址相同。編譯器可以把多次使用的相同字面量儲存在一處或多處。另乙個編譯器可能在不同的位置儲存 3 個 「i』m special」。第三,靜態資料使用的記憶體與 ar 使用的動態記憶體不同。不僅值不同,特定編譯器甚至使用不同的位數表示兩種記憶體。

4、陣列和指標的區別

初始化字元陣列來儲存字串和初始化指標來指向字串有何區別?例如,假設有下面兩個宣告:

char heart = 「i love tillie!」;

const char *head = 「i love millie!」;

兩者主要的區別是:陣列名 heart 是常量,而指標名 head 是變數。那麼,實際使用有什麼區別?

只有指標表示法可以進行遞增操作。

這類似於 x = 3; 和 3 = x; 的情況。賦值運算子的左側必須是變數(或概括地說是可修改的左值),順帶一提,head = heart; 不會導致 head 指向的字串消失,這樣做只是改變了儲存在 head 中的位址。

第十一章 字串和字串函式

第十一章 1 有 0才能叫字串 2 char m3 char m3 後者m3是陣列形式,是乙個位址常量,不能 m3 前者m3是乙個指標變數,可以 m3 3 字串輸入 停止特點 例子特殊用法 gets 遇到換行符 不檢查預留空間,宜溢位 gets name while gets name null 檢...

第十一章 字串和字串函式

字串字面值 用雙引號括起來的內容稱為字串字面量,雙引號中的字元和編譯器自動加入末尾的 0字元,都作為字串儲存在記憶體中,如果字串字面量之間沒有間隔,或者用空白字元分隔,c會將其視為串聯起來的字串字面量。字元陣列名和陣列名一樣,指向該陣列的首元素的位址。字串內部想要使用雙引號,在引號前加 字串陣列初始...

字串和字串函式

字元輸入輸出 getchar putchar ch getchar putchar ch 字串函式 字串輸入 建立儲存空間 接受字串輸入首先需要建立乙個空間來存放輸入的字串。char name scanf s name 上述的用法可能會導致程式異常終止。使用字串陣列 可以避免上述問題 char na...