C/C++中取地址符&的语义
来源:互联网 发布:数据分析工作不好找 编辑:程序博客网 时间:2024/05/01 21:28
在C语言中,&符号大家一定很熟悉吧。
它除了可以作为按位运算“与”之外还有更常用的功能——取变量地址。
我们首先看下面一个简单的例子:
#include <stdio.h>
int main(void)
{
int a = 0;
int *p = &a;
printf("The value is: %d/n", *p);
return 0;
}
上面代码中,指针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++中,&还可以表示引用,这个就不多说了。
#include "iostream"
using namespace std;
int main(void)
{
int a = 0;
int &r = a;
cout << "The value is: " << r << endl;
return 0;
}
- C/C++中取地址符&的语义
- C/C++中取地址符&的语义
- c中取地址运算符&与指针取成员运算符->的优先级
- C中引用'&'与取地址'&'的区别
- 关于C语言中对数组取地址的理解
- c语言中取地址解析
- c语言中static的语义
- C语言中取地址符&做函数形参?—— 引用的讨论
- C语言中取地址符&做函数形参?—— 引用的讨论
- C语言中取地址符&做函数形参?—— 引用的讨论
- C语言函数的取地址符和星号
- [c++]如何取重载函数的地址
- C C++ 取地址符 分析
- 关于C语言取地址运算符”&“
- (九)C语言数组的取值,取地址。
- C 数组名取地址
- C语言数据结构中取地址符&做函数形参?
- C语言的&(取地址)和*的正确理解
- 用PHP的ob_start(); 控制您的浏览器cache!
- Programming Windows Security the code
- 用treeview从数据库中读取子节点
- 什么是COM组件
- C++宏定义讲解
- C/C++中取地址符&的语义
- css技巧
- HSI、HSV、RGB、CMYK、HSL、HSB、Ycc、XYZ、Lab、YUV颜色模型的区别
- 转来的文章:http://hi.baidu.com/qinuo5277/blog/item/ba87ac0838205b39e92488ae.html
- 敏捷无敌之不仅仅是站立(17)
- 用线性插值算法实现图像缩放
- SQL中drop,delete和truncate的异同
- Windows 2003安全配置最佳方法
- Windows 2003 Server安全配置完整篇