//定義四個變量
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;輸出結果如下
與調試窗口看到的地址是一致的: