在C语言中,&符号大家一定很熟悉吧。
它除了可以作为按位运算“与”之外还有更常用的功能——取变量地址。
我们首先看下面一个简单的例子:
- <pre class="Csharp" name="code">#include "stdio.h"
- int main(void)
- {
- int a = 0;
- int *p = &a;
- printf("The value is: %d/n", *p);
- return 0;
- }
- </pre>
上面代码中,指针p指向变量a的地址。在C/C++中,每个变量都有其相应的地址,通过在变量标识符前加&符号即可获得变量的地址。
那么我们这么写可以吗?int *p = &0x01000;
这显然不行。因为对于一个数值常量,它是没有地址的。而变量之所以有地址就是因为要有一个地址来存放变量的值。
我们再看下面的代码:
- #include "stdio.h"
- int main(void)
- {
- int a = 0; // &a = 0x0012ff60
- int *p = &*(int*)0x0012ff60;
- printf("The value is: %d/n", *p);
- return 0;
- }
上面代码又是怎么回事呢?
先前已经调查过变量a的地址——0x0012ff60,那么这里的指针p实际上也是指向变量a的地址。
首先,将0x0012ff60作为int*,这时它与&a是等价的。
然后*(int*)0x0012ff60表示取变量a的内容。
最后,&*(int*)0x0012ff60表示再脱去*(int*)0x0012ff60的解引用,相当于又变为(int*)&a。
因此,这里的&与第一个例子中的&是不同的语义。这里的&不是取地址,因为一个常量*(int*)0x0012ff60是没有地址的。
所以这里的&表示脱去解引用。
再看下面的例子,加深印象:
- #include "stdio.h"
- int main(void)
- {
- int a = 0;
- int *p = &*&*&a;
- printf("The value is: %d/n", *p);
- return 0;
- }
在C++中,&还可以表示引用,这个就不多说了。
- <pre class="csharp" name="code">#include "iostream"<iostream></iostream>
- using namespace std;
- int main(void)
- {
- int a = 0;
- int &r = a;
- cout << "The value is: " << r << endl;
- return 0;
- }
- </pre>