int *a;
*a=3;
cout<<a;
爲什麼上面的代碼片斷顯示內存地址,而下面的代碼片段顯示整個字符串本身?異常beteen一個char poiner和一個整數指針
char *a;
a="string";
cout<<a;
我如何分配「串」直接一個而在INT指針的情況下是不可能的? 分配「串」爲指針一個應更換地址本身,對不對? 如果情況並非如此,請詳細說明編譯此代碼時發生的情況。
int *a;
*a=3;
cout<<a;
爲什麼上面的代碼片斷顯示內存地址,而下面的代碼片段顯示整個字符串本身?異常beteen一個char poiner和一個整數指針
char *a;
a="string";
cout<<a;
我如何分配「串」直接一個而在INT指針的情況下是不可能的? 分配「串」爲指針一個應更換地址本身,對不對? 如果情況並非如此,請詳細說明編譯此代碼時發生的情況。
在第一個例子,int *a;
創建一個指向int
有一個未定義的值,即你沒有指定它指向任何地方。
然後,第二行放置在隨機位置值3的a
這很可能導致程序崩潰,但並不總是指向。
第三行打印指針作爲存儲器地址的值。
在第二個示例中,char *a;
創建了一個指向char
的未定義值的指針,即您未將它指定給任何指向的位置。
第二行然後分配a
指向常量字符串string
。
第三行輸出a的字符串值,因爲std :: stream類專用<<
運算符,用於輸出字符串char*
。
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
'* a = 3'表現出未定義的行爲,通過取消引用未初始化的指針。 –
第二個示例調用'operator <<(const char *)'重載,該重載假定它的參數指向C風格的NUL終止的字符串,並輸出相同的結果。第一個例子調用'operator <<(void *)'重載,它輸出存儲在指針中的地址。 –