2017-11-11 30 views
0
int *a; 
*a=3; 
cout<<a; 

爲什麼上面的代碼片斷顯示內存地址,而下面的代碼片段顯示整個字符串本身?異常beteen一個char poiner和一個整數指針

char *a; 
a="string"; 
cout<<a; 

我如何分配「串」直接一個而在INT指針的情況下是不可能的? 分配「串」爲指針一個應更換地址本身,對不對? 如果情況並非如此,請詳細說明編譯此代碼時發生的情況。

+3

'* a = 3'表現出未定義的行爲,通過取消引用未初始化的指針。 –

+0

第二個示例調用'operator <<(const char *)'重載,該重載假定它的參數指向C風格的NUL終止的字符串,並輸出相同的結果。第一個例子調用'operator <<(void *)'重載,它輸出存儲在指針中的地址。 –

回答

0

在第一個例子,int *a;創建一個指向int有一個未定義的值,即你沒有指定它指向任何地方。

然後,第二行放置在隨機位置值3的a這很可能導致程序崩潰,但並不總是指向。

第三行打印指針作爲存儲器地址的值。

在第二個示例中,char *a;創建了一個指向char的未定義值的指針,即您未將它指定給任何指向的位置。

第二行然後分配a指向常量字符串string

第三行輸出a的字符串值,因爲std :: stream類專用<<運算符,用於輸出字符串char*

0

std:ostream專門基於所述數據類型的<<運算符。對於char*,它假設一個字符串,因爲這是C++進化的C語言中使用的慣例。對於其他指針類型,運算符<<只顯示指針,因爲沒有建立終止非char數組的約定(char數組字符串由字符值零終止)。

a = "string"的情況下,"string"的地址將被存儲(儘管一個好的編譯器會警告你關於const的問題)。這是一種僅適用於字符數組的特殊情況語法 - 同樣,因爲這是C語言管理文本的方式。另外,這種爲char類型提供特殊情況處理的趨勢在多年以來一直困擾着我多次,當我嘗試顯示一個8位整數時,卻顯示出一個字符 - 強制我投射。

uint8_t i=65; 
cout<<"results: "<<i<<", "<<(int)i<<"\n"; 

results: A, 65