(1)首先通過一個例子看(int)和(int&)的區別:
float a = 1.0f;
cout << (int)a << endl;
cout << (int&)a << endl;
cout << boolalpha << ( (int)a == (int&)a ) << endl; // boolalpha 用符號形式表示真假
float b = 0.0f;
cout << (int)b << endl;
cout << (int&)b << endl;
cout << boolalpha << ( (int)b == (int&)b ) << endl;
輸出:
1
1065353216
false
0
0
true
解釋:
(int)a實際上是以浮點數a為參數構造了一個整型數,該整數的值是1;
(int&)a則是告訴編譯器將a當作整數看(並沒有做任何實質上的轉換)
因為1以整數形式存放和以浮點形式存放其記憶體資料是不一樣的,因此兩者不等。
但是0的整數形式和浮點形式其記憶體資料是一樣的,因此在這種特殊情形下,兩者相等(僅僅在數值意義上)。
注意:
程式的輸出會顯示(int&)a=1065353216,這個值是怎麼來的呢?前面已經說了,1以浮點數形式存放在記憶體中,按ieee754規定,其內容為0x0000803F(已考慮位元組反序)。這也就是a這個變數所佔據的記憶體單元的值。當(int&)a出現時,它相當於告訴它的上下文:“把這塊地址中的內容當做整數看待!不要管它原來是什麼。”這樣,內容0x0000803F按整數解釋,其值正好就是1065353216(十進位數)。
通過查看彙編代碼可以證實“(int)a相當於重新構造了一個值等於a的整型數”之說,而(int&)的作用則僅僅是表達了一個類型資訊,意義在於為cout<<及==選擇正確的重載版本。
(2)(int*)是將一個變數(此變數不能是浮點型,可以是整型、字元、指標)以地址的形式顯示,和(int&)的原理一樣,當(int&*)a出現時,它也相當於告訴它的上下文:“把這塊地址中的內容當做一個地址看待!不要管它原來是什麼。”
例如:
char p='a';
cout<<(int)p<<endl;
cout<<(int*)p<<endl;
輸出:
97
00000061 //97的十六進位數
這在輸出字元數組的首地址時十分有用:
char *p="abcd";
cout<<(int*)p<<endl;
否則cout<<p<<endl;
輸出的是abcd,而不是其首地址。