薦 字串與指標常量

2021-06-03 19:02:44 字數 1774 閱讀 4495

【更新說明】2012-3-16

【問題描述】

看乙個常見的例項,我們經常進行類似於下例的初始化操作:

char *message = "hello c";
書本告訴我們上述操作等價於:

char *message;

message = "hello c";

注意:實際上不能這麼做,因為message指標未分配記憶體。

問題:為什麼不是

char *message;

*message = "hello c";

下面從指標的角度分析。

【分析】

1  指標常量和常量指標

我們常看到這兩個概念,很容易混淆,其實很簡單,看下面兩組用const關鍵字修飾的概念:

type * const pointer ; - 指標常量,指標指向的位址是常量,即位址不可變,但指向的內容可以變。

這個寫得很好,不過我認為還是不必記憶,只要記住指標結合性就可以了。

【指標結合性】

【修改·2012-2-24】

2 字串與常量指標

其實字串"hello c"是常量指標,為什麼這麼說呢?因為,char *message = "hello c";等價於char message = "hello c";。訪問字串,實質是在訪問字串儲存的位址。只不過這個指標很奇特,因為他儲存的內容是const的。所以,不能對字串進行賦值以試圖修改其值。

既然"hello c「是指標,那麼對*message賦值顯然就不對了。其一,*message不是指標;其二,*message的內容是常量,也是不可變的。

2 字串與指標常量

字串"hello c"是指標常量,可以通過指標訪問,不可修改其位址(初始化或賦值操作時,位址就確定了),但其值(內容)可能會因為越界等問題發生改變。因為,char *message = "hello c";等價於char message = "hello c";。訪問字串,實質是在訪問字串儲存的位址。既然"hello c「是常量,那麼對*message賦值顯然就不對了。其一,*message不是指標;其二,*message的內容(類似於"hello c"的字串)是常量,也是不可變的。但message本身沒有被const修飾,因此既不是常量指標,也不是指標常量。

【增-2012.3.16】

3 strcpy為什麼要傳遞陣列作為dest引數?

char *pathname = "/usr/temp/*********x";

/*insert filename*/

strcpy(pathname+10, "abcde");

這是我們經常遇到的例子。gcc編譯時,不會出錯,但執行時,往往報段錯誤。這是什麼原因?

"/usr/temp/*********x"是乙個常量指標,在初始化時,char *pathname進行了強制轉換,pathname儲存的是乙個指標常量。在使用strcpy時,對這個指標常量的值進行了修改,這個結果是未定義的。正確的做法是將pathname宣告為乙個陣列型別。

4 乙個例子

將二進位制值轉換為字元:

putchar("0123456789abcdef"[value%16]);
【分析】

「0123456789abcdef」是乙個指標常量,「0123456789abcdef」[0]值為0,「0123456789abcdef」[1]值為1,依次類推。「0123456789abcdef」+0與「0123456789abcdef」[0]等價。

指標和字串常量

指標和字串常量 首先比較兩段 1char ch1 hello ch1 h ok ch1 0 h ok printf s r n ch1 2 char ch2 world ch2 w 執行時錯誤 ch2 0 w 執行時錯誤 printf s r n ch2 這裡的 world 是字串常量,而 hell...

指標和字串常量

在閱讀c和指標這本書,才發現自己一直對於字串常量的概念不夠清晰。字串常量可以說是乙個指標,char pathname usr temp xx strcpy pathname 10,abcde printf s n pathname 像這3條語句其實是非法的,因為pathname 是乙個指向char型...

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

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