字串就是一串零個或多個字元,並且以乙個位模式為全0的nul位元組結尾。其中nul是人為定義用作字串結尾的標誌,所以字串的長度不包括nul位元組。
nul位元組其實就是ascii碼為0的數。
例:
char *line = "world0";
則在gdb除錯發現:
(gdb)x/7d line
0x8048470
119111
114108
10048
0
分別對應」world90」的asic碼,而最後的乙個0表示字串的結尾。
c語言字串常量用一對雙撇號(」「)括起來,而字元常量用一對單撇號(」)括起來,如下面的例子所示:
char ch = ' a '
char *str = " a ";
『a』是乙個字元常量,而「a」確是乙個字串常量,只不過這個字串的長度是1,即只有乙個字元。字串常量和字元常量的不同在於系統給字串常量的結尾加上乙個字串結束標誌』\0』, 『\0』可以理解成0b00000000。
不能將乙個字串常量給字元變數。
char ch = "a"; //錯誤,gnu下會產生warning
char arr[5]; /*充當字串變數的角色*/
arr[5] = = "hello";
則陣列中儲存的資料如下:
陣列名012
345arrhe
llo\0
除了字元陣列,c語言還支援另外一種表示字串的方法,就是直接使用乙個指標指向字串,如下面程式所示:
char *str; /*充當字串變數的角色*/
srt = = "hello";
gdb除錯結果如下:
(gdb)x/6c
0x80484470: 104
'h'101
'e'108
'l'108
'l'110
'0'0
'\000'
char chararray[6]=;
char chararray[5]=; //字元陣列並不要求它的最後乙個字元為'\0',甚至可以不包含'\0',向這種是完全合法的。但與上面的字元陣列的長度不同,
char *p1 = ;
char *p1 = "hello"; //也可以省略大括號
char *p1 = "hello";//字元指標
char p2 = "another hello"; //字元陣列,值得注意的是當陣列大小省略時,系統自動計算大小。但注意其大小包含結尾的'\0'
對於個字元指標的初始化方式,是直接將常量區中字串對應的位址賦值給p1,所以這個位址其實就是常量區中hello對應的位址,所以用如*p1 =』h』這種操作是不行的,因為p1指向的是常量區的記憶體,常量區的記憶體是不允許修改的,在編譯期間就已經確定了。
對於個字元陣列的初始化方式,將常量區中對應的字串,以4個位元組為單位,乙個乙個複製到棧記憶體中,最後區域性指標p2指向這片記憶體。所以*p2 =『h』,這個操作是允許的,因為這修改的是棧記憶體中的內容。
另外要注意的是:
char arr[10];
arr = "hello";
這種寫法是錯誤的,因為c語言並沒有提供可以直接操作字串的運算子;「=」可以用於其他資料型別的賦值,但是不可以直接給字串賦值。
待更新
c語言字串指標(指向字串的指標)c語言中字元陣列的初始化與賦值
《c和指標》
C語言字串的那些事兒
c語言中,字串的使用對於初學者來說是個很容易混淆 很容易出錯。c語言字串是以 0 結尾。因此,我們使用字串時,始終要記得留乙個位元組用於存放結尾符。請看下面一段 哪個地方會在執行時出錯?1 2 3 4 5 6 char str1 hello,world char str2 100 hello,wor...
關於字串的那些事兒
字串,大家都是知道的,但是儲存它的手段卻有很多,不管是char 陣列還是string抑或是 vector,或者這三者的指標都是可以的。那麼我們如何正確的使用它們呢?我通過乙個小專案,期間遇到各種的問題,現在稍微有些眉目。現在記錄一下,以便以後使用,也為大家略盡綿薄之力。char str1 15 ab...
C語言那些事兒
專案名稱 蘇嵌實訓 嵌入式linuxc第3天 今日進度以及任務 學習了c語言的基本知識 本日任務完成情況 掌握了c語言的基本知識 本日開發 現的問題彙總 c語言中的細節問題要注意 本日未解決的問題 無本日開發收穫 進一步熟悉了c語言其他無 c語言1 c語言之父?丹尼斯里奇 2 c的特點 優勢 語言標...