&表示脱去解引用

 

在C语言中,&符号大家一定很熟悉吧。

它除了可以作为按位运算“与”之外还有更常用的功能——取变量地址。

我们首先看下面一个简单的例子:

  1. <pre class="Csharp" name="code">#include "stdio.h"  
  2.   
  3. int main(void)  
  4. {  
  5.     int a = 0;  
  6.   
  7.     int *p = &a;  
  8.   
  9.     printf("The value is: %d/n", *p);  
  10.   
  11.     return 0;  
  12. }  
  13. </pre>  

上面代码中,指针p指向变量a的地址。在C/C++中,每个变量都有其相应的地址,通过在变量标识符前加&符号即可获得变量的地址

那么我们这么写可以吗?int *p = &0x01000;

这显然不行。因为对于一个数值常量,它是没有地址的。而变量之所以有地址就是因为要有一个地址来存放变量的值。

我们再看下面的代码:

  1. #include "stdio.h"  
  2.   
  3. int main(void)   
  4. {   
  5.     int a = 0; // &a = 0x0012ff60   
  6.     int *p = &*(int*)0x0012ff60;   
  7.     printf("The value is: %d/n", *p);   
  8.     return 0;   
  9. }  

 上面代码又是怎么回事呢?

先前已经调查过变量a的地址——0x0012ff60,那么这里的指针p实际上也是指向变量a的地址。

首先,将0x0012ff60作为int*,这时它与&a是等价的。

然后*(int*)0x0012ff60表示取变量a的内容。

最后,&*(int*)0x0012ff60表示再脱去*(int*)0x0012ff60的解引用,相当于又变为(int*)&a。

因此,这里的&与第一个例子中的&是不同的语义。这里的&不是取地址,因为一个常量*(int*)0x0012ff60是没有地址的。

所以这里的&表示脱去解引用。

再看下面的例子,加深印象:

  1. #include "stdio.h"  
  2.   
  3.   
  4. int main(void)  
  5. {  
  6.     int a = 0;  
  7.   
  8.     int *p = &*&*&a;  
  9.   
  10.     printf("The value is: %d/n", *p);  
  11.   
  12.     return 0;  
  13. }  

在C++中,&还可以表示引用,这个就不多说了。

  1. <pre class="csharp" name="code">#include "iostream"<iostream></iostream>  
  2. using namespace std;  
  3.   
  4.   
  5. int main(void)  
  6. {  
  7.     int a = 0;  
  8.   
  9.     int &r = a;  
  10.   
  11.     cout << "The value is: " << r << endl;  
  12.   
  13.     return 0;  
  14. }  
  15. </pre>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值