字串常量 字元陣列 字元指標的一點小結

2021-06-26 12:55:06 字數 1403 閱讀 6194

在程式中如果出現了字串形式,編譯器在處理的時候通常會在其末尾新增乙個『\0'符號,作為字串的結束標識。

通常,字串常量在程式中有兩種可能的身份——1、字元陣列的初始化列表;2、真正的字串常量

1、字元陣列的初始化列表

例如,有

char string = "hello";
在這裡出現了字串「hello」,編譯器在處理的時候會為其新增乙個』\0『。這裡是將字串賦給陣列,因為生命陣列時編譯器會分配記憶體,因此字串會被存放在分配的記憶體中,即該句**等價於

char string = ;
這裡的字串的「容身之所」會根據陣列的作用域而言,如果是靜態陣列則存放在靜態資料區,如果陣列是在某個函式中宣告的,則字串將被存放在棧中。賦值之後我們就無需再考慮字串了,因為它已經被存放在陣列中了,接下來的工作就是對陣列進行所需要的操作了。

2、作為字串常量

當作為字串常量在程式中被使用時常常會生成乙個指向字元的常量指標。此時該字串是乙個常量,將被編譯器放置在常量區中,然後得到該字串首個字元在此常量區中的位址,這個位址就是該字串常量的直接值,字串常量的直接值並不是該字串自己本身。即「hello」的值是』h『在常量區中的位址。因此可以有

char *pt = "hello";

由於字串是存放在常量區中,因此,只能通過指針對其進行讀,而不能修改其中的值。例如可以有

char ch = pt[0];
如下的操作將出現異常,即無法修改常量區中的值,

pt[0] = 'p';
讓人糾結的是上面的**可以通過編譯,但是會在程式執行的時候發生異常,這樣會讓程式設計人員在編寫程式的時候不容易發現這種錯誤,因此在c++中有所改進,即將字串常量賦給乙個常量指標,即

char const *pt = "hello";
這樣可以在試圖訪問pt[0]的時候,在編譯階段就可以發現錯誤。所以此處的字串常量可以理解為常量字元陣列。

3、輸出字元指標

如果是以字串格式(%s)輸出字元指標,輸出的機制是從當前指標所指向的空間開始,一直往後輸出相鄰的空間資料,直到遇到乙個』\0『字元為止。

因此下面的語句將都輸出hello

printf("%s\n",pt);

printf("%s\n",string);

這裡都能順利輸出,因為字元指標pt和string都是一字串初始化的,因此在結尾都會有乙個』\0『字元。

字元陣列,字元指標,字串常量

一 字串可以賦值給字元指標變數 char p hello 其實這裡分配了常量,即const,如果不讓p指向別的位址就無法修改。char q world cout p q 1.字串常量 hello 出現在乙個表示式中時,hello 表示式使用的值就是這些字元所儲存的位址 在常量區 而不是這些字元本身。...

C C 字串常量 字元陣列和字元指標

通常,如果在程式中定義了乙個字串,那麼為了節省記憶體,會把相同的字串儲存到乙個單獨的 相同的位置,此時如果用多個字元指標指向它,那麼指標的值會相同。常量字串位於c c 的文字常量區,在程式結束以後由系統釋放。char p string1 example char p string2 example ...

C C 字元陣列 字元指標和字串常量

c 有兩種處理字串的方式,除了沿用c風格字串,另一種方法是借助用string class庫。字串是一系列儲存在連續記憶體位元組中的字元 每個字元對應乙個位元組 所以可以將字串儲存在字元陣列中。以下四種宣告方式都是字元陣列,但是只有第乙個不是字串,其中無效字元 null character 0 其在機...