談談(int *)與(int &)

本文详细解释了C语言中各种类型的强制转换,包括指针和地址的类型转换,并通过实例展示了(float)、(int*)和(int&)等类型的使用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天在網上看到了有關(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;

⑥處:’‘’

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值