今天在網上看到了有關(int &)的討論,覺得很有意思,就此我們也來研究研究。
&a、(int &)a、(int)&a、(int)(&a)、(int)(&)a以及*a、(int *)a、(int)*a、(int)(*a)、(int)(*)a、*(int *)a
大家都知道*是指針運算符,一個地址前面加上*就是這個地址中的內容;&是地址運算符,一個變量前面加上&就是取這個變量在內存中的地址。這都簡單,比如:





a是一個地址,比如0x11223344,這個地址重裝的內容是100;b是個變量,它“座落”在比如0x55667788這個地址上,那么這個地址中裝的就是200。
那么于是就出現了(int *)和(int &),這兩個家伙真是奇怪。
我們不妨回顧一下(int)這種寫法,(int)是類型轉換,比如char a了,後來又想把a當作一個整型的變量,把其值賦給b,那么就(int)a一把,也就是int b = (int)a。
于是(int *)、(int &)也一樣式類型轉換,前者是把一個東西強制轉換成一個指針,一個指向整數的指針。比如a本來是一個指針,不過它是指向char類型的,char *a;現在我們打算把它的值轉換成一個指向整型數字的指針(注意是把a的值轉換成指向整型數字的指針,不是把a轉過去,a還是a),就得這樣:


如果不加強制轉換(int *)編譯器會認為兩邊的類型不匹配而不干。
後者(int &)著實讓人有些迷惑。其實仔細想想,(int &)也不難:(int *)是把一個東西轉換成指向整型數的指針,那些么(int &)就是把一個東西的地址轉換成一個整數。
這話說得奇怪,整型數的地址跟別的類型數的地址有什么不同嗎?
沒有,沒什么不同。。。地址都是一樣的,在32位系統下就是一個32位的值,如0x11223344,64位系統下就是一個64位的值,這個值當然是個整數。那么(int &)一下是什么意思呢?(int &)就是把它後面那個家伙的地址轉換成一個整型數的地址,由于整型數的地址與別的型數的地址別無二致,所以int &)就是把它後面那個家伙的地址轉換成一個地址,其效果完全==&。汗吧!其實就是取地址。。。
比如我們來這樣看看:










①處:結果是1,浮點數1.0轉換成整數還是1;
②處:;結果是0x3F800000,十進制就是1065353216。因為1.0這樣一個浮點數放在內存當中就是0x3F 80 00 00的,為什么是這個值?這個你處理器的體系結構有關,我用的是intel32的處理器,它就這么放。如果你把a改成2.0這個值就變成了0x40 00 00 00,3.0是0x40 40 00 00……怎么看這個值?在調試模式下設置合適的斷點,去看變量a所在的那塊兒內存就行了;
③處:還是0x3F800000,任何地址都一樣;
④處:是0x3F800000;
⑤處:是0x3F800000;
⑥處:’‘’