談談(int *)與(int &)

今天在網上看到了有關(int  &)的討論,覺得很有意思,就此我們也來研究研究。

&a、(int &)a、(int)&a、(int)(&a)、(int)(&)a以及*a、(int *)a、(int)*a、(int)(*a)、(int)(*)a、*(int *)a

大家都知道*是指針運算符,一個地址前面加上*就是這個地址中的內容;&是地址運算符,一個變量前面加上&就是取這個變量在內存中的地址。這都簡單,比如:

int   * a;
* =   100 ;

int  b;
=   200 ;

 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   * b;
=  ( int   * )a;

如果不加強制轉換(int *)編譯器會認為兩邊的類型不匹配而不干。

後者(int &)著實讓人有些迷惑。其實仔細想想,(int &)也不難:(int *)是把一個東西轉換成指向整型數的指針,那些么(int &)就是把一個東西的地址轉換成一個整數

這話說得奇怪,整型數的地址跟別的類型數的地址有什么不同嗎?

沒有,沒什么不同。。。地址都是一樣的,在32位系統下就是一個32位的值,如0x11223344,64位系統下就是一個64位的值,這個值當然是個整數。那么(int &)一下是什么意思呢?(int &)就是把它後面那個家伙的地址轉換成一個整型數的地址,由于整型數的地址與別的型數的地址別無二致,所以int &)就是把它後面那個家伙的地址轉換成一個地址,其效果完全==&。汗吧!其實就是取地址。。。

比如我們來這樣看看:

float  a  =   1.0f ;
printf(
" (int)a=%d " , ( int )a);  //①
printf(
" (int &)a=0x%X " , ( int   & )a);  //②
printf(
" (char &)a=0x%X " , ( char   & )a);  //③
printf(
" (double &)a=0x%X " , ( double   & )a);  //④
printf(
" &a=0x%X " & a);//⑤

float  b  =   0.0f ;
printf(
" (int)b=%d " , ( int )b);
printf(
" (int &)b=%d " , ( int & )b);  //⑥

①處:結果是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;

⑥處:’‘’

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值