C++輸出指向字符的指針亂碼

//定義四個變量
	int i = 100;
	char  c  = 'a';
	char arr[5] = { 'a','b','c' };
	int  arr2[6] = { 1,23,4 };
//定義四個指針	 
	 int *   p1 = &i;
	char *   p2 = &c;
	char *   p3 = arr;	 
	 int *   p4=arr2;
//輸出四個指針
	cout << p1 << endl;//輸出p1所指的地址
	cout << p2 << endl;//輸出p2所指的字符+亂碼
	cout << p3 << endl;//輸出p3所指的char型數組的每一個元素
	cout << p4 << endl;//輸出p4所指的int 型數組首元素的地址

輸出結果如下圖
在這裏插入圖片描述
原因是:

在C++中,當使用cout輸出指針時,要注意輸出char* 指針和其他類型指針並不相同。
cout輸出 char* 的指針時,直接輸出char *指針所指的字符,然後繼續後移輸出,直至遇見字符的結束標誌’\0’停止;
cout輸出其他類型指針時都是輸出指針所指的地址。

下面解釋兩個問題:

1、爲什麼cout<<p2;得到的是亂碼?
 	p2是一個字符指針,所以它會直接輸出p2所指的字符,所以你看它雖然是亂碼,
但輸出的第一個字符就是指針p2所指的字符,然而它並沒有遇見'\0'結束標誌,所以
它就會沿着內存繼續往後讀取,從而造成亂碼。
	當輸出p3時,由於編譯時編譯器會自動給該數組最後一個字符後面添加'\0'字符,標誌字符的結尾。
在輸出時,遇見每一個char *直接輸出它所指的字符,直至遇見'\0'停下,所以沒有亂碼,
從而輸出了整個字符數組。
所以cout<<p2;得到的是,正確字符+(亂碼)
2、cout <<p4;爲何只輸出了首元素的地址?
	因爲p4指針實際上指的是,arr2首元素的地址,是一個 int *所以,只會輸出首元素的地址。
只有輸出char*指針,纔會在內存空間繼續讀取了。 
3、如果我非要輸出,char *指針的所指的地址怎麼辦?
把char *指針,轉換成void*,在輸出得到的就是p2,所指的地址。
cout<<(void *)p2;輸出結果如下

在這裏插入圖片描述
與調試窗口看到的地址是一致的:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章