指针,引用区别
来源:互联网 发布:网络零售的分类 编辑:程序博客网 时间:2024/05/22 15:06
指针和引用看上去完全不同,但它们似乎具有相同的功能。先看一个小例子,了解下究竟编译器对他们做了什么处理。
int main()
{
int i = 3;
int *p = &i;
return 0;
}
我们生成它的汇编代码,主要部分为:
main:
.LFB2:
pushl %ebp
.LCFI0:
movl %esp, %ebp
.LCFI1:
subl $8, %esp
.LCFI2:
andl $-16, %esp
movl $0, %eax
addl $15, %eax
addl $15, %eax
shrl $4, %eax
sall $4, %eax
subl %eax, %esp
movl $3, -4(%ebp) //i初始化 leal -4(%ebp), %eax //加载i的地址到寄存器eax movl %eax, -8(%ebp) //把i的地址赋值给p
movl $0, %eax
leave
ret
然后把int *p = &i改成 int &p=i;再生成汇编代码,发现和上面是一样的(在Linux下diff file1 file2)。那就可以这样认为,对于编译器指针和引用是没有任何区别的。那什么时候用指针,什么时候用引用,在使用中又有什么不同。
1. 指针可以不初始化,但是引用不行,引用相当于别名,不可能给一个不存在的事物取个歪名吧。
int *p; //right
int & r; //error
延伸一下,如
int *parr[10]; //right
int &rarr[10]; //wrong
可以定义指针数组,但不可以定义引用数组,这很好理解,引用必须初始化。看下面
int k[10] = {1,...,10};
int (*parr)[10] = &k; //right
int (&rarr)[10] = k; //right
可以定义数组指针去指向k数组,引用也可以。
2. 指针在使用之前需要检测是否为空,而引用不需要。
if(NULL!=p) {
...
}
3. 当对指针和引用进行操作时,他们表现出不同的特性。
p++; //p自增,指向下一个位置
r++; //是对引用所指的对象进行自增操作。
p=&j; //p指向另一个变量j
r=j;//把j的值赋值给i
4. 对于引用需要养成好习惯,尽量对非指针变量采用引用,呵呵,这纯属个人观点。像下面这样使用,合法但是却造成未定义的行为,这是非常危险的行为,要尽量避免这样的陷阱。
int * p = NULL;
int& rc = *p;
当指向一个对象而又不想改变指向时,用引用吧。
- 指针与引用区别
- 指针,引用区别
- 引用与指针区别
- 指针和引用区别
- 指针,引用 的区别
- 指针与引用区别
- 指针和引用区别
- 指针和引用区别
- 指针 引用 区别
- 指针 引用 区别
- 引用与指针区别
- 指针与引用区别
- 引用 指针的区别
- 引用与指针区别
- 引用和指针区别
- 指针与引用区别
- 指针和引用区别
- 引用与指针区别
- 在VC6.0和VS2010下编译pthreads-w32-2-8-0-release
- asp.net定时发送邮件总结
- WebGL简单范例及代码
- 向大家推荐---Docuvix企业文档管理解决方案
- Ogre OcttreeSceneManager
- 指针,引用区别
- 用户自定义结构数据与VARIANT转换
- VC++开发BHO插件——定制你的浏览器
- 提供香港进口;进口代理;快件进口;包税进口
- ASP.NET MVC 1.0 转化为ASP.NET MVC 2.0的方法
- [游戏]求生之路搞怪语音
- sliverlight 资源动态调用
- 设置系统生成或不生成core dump文件
- 精美摘抄,献给每一位有理想的大学生!