指针与引用的区别

相同点:

1.     指针与引用都是地址的概念。指针指向一块内存,指针的内容是所指向内存的地址;而引用则是某块内存的别名。

2.     引用在语言内部用指针实现。

3.     一般把引用理解为指针,不会犯严重语义错误。引用操作可以看做是受限的指针(仅允许取内容操作)。

不同点:

1.     指针逻辑上是独立的,可以改变指针的内容,也可以改变指针指向的内存中的内容;而引用只是一个别名,在逻辑上不上独立的,它的存在具有依附性,必须在声明时就初始化,而且引用的对象在整个生命周期中时不能被改变的,但是其指向的内存的内容可以被改变。

2.     声明上的区别:指针的声明如int* p;可以独立声明;而引用声明,int a; int &b = a;必须依附某个变量。指针存储的是一个地址,指向内存的一个存储单元;而引用跟原来的变量实质上是一个东西,只不过是原来变量的一个别名而已。

3.     指针使用时需要解引用,即添加*符号;而引用使用时无需解引用,可以直接使用。

4.     指针可以用const修饰,常量指针的内容(即存储的地址)是不可改变的;而引用不能用const修饰,因为其本身就不能被改变。

5.     “sizeof(引用)”得到的是所指向的变量(对象)的大小;而“sizeof(指针)”得到的是指针本身数据类型的大小。

6.     指针和引用的自增(++)运算意义不同,指针是其内容(即存储的地址)自增;而引用是其指向内存的内容自增。

7.     指针在初始化后可以被改变;而引用只能在声明时初始化,且不能被改变。

8.     指针的值可以为空,即不指向任何内存地址;而引用必须在定义时初始化,不能为空。

9.     指针可以有多级;而引用只能一级。

10.  引用时类型安全的,而指针不是,引用比指针多了类型检查。

11.  指针作为函数参数时,实际上是值传递,即将指针的地址进行复制,赋值给函数形参,函数形参在栈中开辟了内存空间来存放由实参传递过来的地址值,从而形成实参的一个副本,值传递到特点是被调用函数对形参的任何操作都作为局部变量进行,不会影响主调函数的实参变量的值。而引用在函数传递过程中,被调用函数的形参也作为局部变量在栈中开辟了内存空间,但这是存放的是由主调函数放进来的实参变量的地址,没有复制的操作,被调用函数对形参的操作都被处理成间接寻址,即通过栈中存放的地址访问主调函数中的实参变量,因此被调用函数对形参的任何操作都影响主调函数的实参变量。

12.  程序在编译时分别将指针和引用添加到符号表上,符号表上记录的是变量名及变量所对应的地址。指针变量在符号表上对应的地址值为指针变量的地址值,而引用在符号表上对应的地址值为引用对象的地址值。符号表生成后就不会再改变,因此指针可以改变其指向的对象(指针变量中的值可以改变),而引用对象则不能修改。

13.  指针传递参数存在堆栈的复制,直接使用指针很容易造成地址溢出错误;而引用减少大量数据经过堆栈的复制,又避免了地址溢出的错误的发生。

posted @ 2015-03-22 09:06  Qin&Yang  阅读(206)  评论(0编辑  收藏  举报