C 字元指標的特殊

2021-06-12 10:21:01 字數 1791 閱讀 6792

如果我們對乙個非字元的指標進行操作,方法是這樣的: 

注意:int* p;則p[i]等價於*(p+i)

定義: 

(1)int a=7; int *p=&a; 或者 

(2)int a=7; int *p; p=&a; 或者 

(3)int a=7; int *p; *p=a; 

(1)這樣定義的原因是因為等號兩邊的型別必須匹配,int *p=&a; 等號左邊定義的是乙個指標,指標的內容是位址,所以等號右邊也應該是位址,&a就是取空間a的位址; 

(2)int *p; p=&a; 為什麼不是 *p=&a 而是 p=&a; 因為在定義的時候「*」只是說明p是乙個指標,而p也是乙個變數,不過是儲存位址的一種特殊的變數,對於變數使用,我們都是直接使用它的名字,就好象,我們定義個常量 const a=7; 我們要呼叫它的時候直接使用a就可以了,並不需要帶上 const 修飾,這裡也一樣,用指標變數時並不需要帶上「*」; 

(3)而第三種情況中的 *p=a;中的「*」和第二種裡面是不同的,這裡的「*」是取內容符,與之相反的是取位址符「&」,分析一下,第三種情況中,等號左邊是*p表示對指標p取內容,它的內容指向記憶體中的某個已經在開始通過 int *p; 定義好的空間裡(比較確切一點的說法是,p在定義的時候,其內容裡的位址指向記憶體中某個未知的空白區域,即未占用,不受保護的記憶體空間),這個空間裡存放的資料型別是整型,所以等號的右邊也應該是整型才能匹配,所以是 *p=a; 這裡的「*」和定義時候的是不同的,這一點很重要。 

其實上面的都是些題外話,我要說的其實是關於指標的輸出的一些問題。我們利用上面定義好的進行輸出操作。 

輸出指標的內容(即所指向空間的位址):cout<

輸出指標所指的內容(即指標內容所描述位址空間中的內容):cout<<*p<

指標對於字元的處理卻有些特殊,和前面的非字元的指標輸出處理要分開理解。 

比如,我們定義乙個 char a='a'; char *p=&a;  如果我們呼叫上面非字元指標的輸出方式,結果如下: 

方式1 cout<

方式2 cout<<*p<

而且我們直接操作 cout<<&a<

為什麼方式1輸出的不是位址呢?這裡有乙個特殊的處理,雖然這裡的p的內容確確實實是乙個位址,但是cout操作字元指標的話,它遇到位址,就會直接去尋找這個位址所指向的內容,並把它的空間裡的機器數按照字元的規則轉化成字元輸出,直到遇到「\0」這個操作符才停止。所以我們直接輸出p的時候,它先輸出『a』然後再繼續讀取後面的記憶體空間知道遇到「\0」,顯示結果是「a+亂碼」。

你肯定會說,為什麼要這樣呢,這樣多不方便呀,其實這麼做是有目的的,而且恰恰就是為了方便才這麼設定的。因為這樣就可以很容易的處理字串了,而處理字串是我們在計算機中用得很多的操作。 

比如我們第乙個字串陣列 char a="mantou"; a在記憶體中在7個位元組,而不是6個,因為在mantou字串後面還隱藏有乙個「\0」,這時我們用 char *p=a; (這裡不用&a是因為,a是乙個陣列,陣列名a本身就是乙個指標常量) 輸出操作 cout<

雖然通常情況下我們是不需要了解我們的資料位址的,但我也順便說說,怎麼得到字元指標的位址,也可以方便大家對記憶體位址的分配再做更深入的研究。 

char a='a';  如果這裡直接輸出 cout<<&a<

做個小技巧,首先我們知道p中的內容本身就是位址,但是因為它是字串,我們又不能直接輸出它,所以呀,我們可以把指標裡的內容(記載的是乙個位址資料)強制轉化成整型再輸出 cout<<(int)p<

cout<

<

<

注意不要忘了 #include這個標頭檔案哦  

c 字元指標的特殊之處

如果我們對乙個非字元的指標進行操作,方法是這樣的 定義 1 int a 7 int p a 或者 2 int a 7 int p p a 或者 3 int a 7 int p p a 1 這樣定義的原因是因為等號兩邊的型別必須匹配,int p a 等號左邊定義的是乙個指標,指標的內容是位址,所以等號...

C 中的特殊字元

特殊字元 c c 語言規範 2.4.4.4 字元 字元表示單個字元,通常由置於引號中的乙個字元組成,如 a character literal 字元 character 字元 character 字元 single character 單字元 escape sequence 簡單轉義序列 hexad...

C 字元的特殊處理

char 陣列中 char p0 2 char p1 2 char p2 2 把ascall碼0對應的字元賦值給陣列,不加 引號賦值都是以ascll碼賦值。char p3 2 char p4 2 這5個都是一樣的上面五種情況都表示空字元。char s 141 141abc t cout s strl...