C++ 指针和引用的区别

来源:互联网 发布:重庆java培训哪个靠谱 编辑:程序博客网 时间:2024/06/01 09:17

一、指针和引用的解释

指针和引用形式上很好区别,但是他们似乎有相同的功能,都能够直接引用对象,对其进行直接的操作,下面简单解释一下指针和引用的区别

指针-对于一个类型T,T*就是指向T的指针类型,也即一个T*类型的变量能够保存一个T对象的地址。

char c=‘A';

char *p=&c;

指针p指向char类型的变量C 。P的值为:&C,即变量C的地址

引用-引用是一个对象的别名,主要用于函数参数和返回值类型,符号X&表示X类型的引用。

int i=1;

int r=&i;

此时r和i指向同一个int类型的对象,对r的操作就是对i的操作。既然是别名,必然是引用一个已经存在的对象,引用不允许为空。故定义一个引用的时候,必须初始化。

二、指针与引用的区别

1. 声明指针是可以不指向任何对象,也正是因为这个原因,使用指针之前必须做判空操作,而引用就不必。这也就是引用的比指针效率高的原因:

void printDouble(const double& rd){cout << rd; // 不需要测试rd,它肯定指向一个个double值}

而使用指针必须进行判空操作:

void printDouble(const double *pd){if (pd) { // 检查是否为NULLcout << *pd;}}
2. 指针与引用的另一个区别:引用不可以改变指向,对一个对象"至死不渝";但是指针可以改变指向,而指向其它对象。虽然引用不可以改变指向,但是可以改变初始化对象的内容。例如就++操作而言,对引用的操作直接反应到所指向的对象,而不是改变指向;而对指针的操作,会使指针指向下一个对象,而不是改变所指对象的内容:

 int i=10; int j=5; int& ref=i; ref++; cout<<"i="<<i<<endl;      //i=11 cout<<"ref="<<ref<<endl;   //ref=11 ref=j; ref++; cout<<"i="<<i<<endl;      //i=6 cout<<"ref="<<ref<<endl;   //ref=6

3. 常量指针和常量引用

常量指针:指向常量的指针,在指针定义语句的类型前加const,表示指向的对象是常量。即:“常量指针”所指向的地址上的数据是常量。

int i=10;const int *pointer=&i; //p就是一个常量指针*pointer=20        //这是不允许的
常量引用:指向常量的引用,在引用定义语句的类型前加const,表示指向的对象是常量。也跟指针一样不能利用引用对指向的变量进行重新赋值操作。

4. 指针常量与引用常量

指针常量:指这个指针本身是一个常量,所指向的地址是常量,地址上面的数据是可以变化的。在定义指针常量时必须初始化!对于引用来说,这是天生具来的属性,不用再在定义语句的引用名前加const。

int i=10;char c='A';int *const pointer =&i; //pointer是一个指针常量,始终指向&i;pointer=&c ; //错误,不能改变它的指向*pointer='B';  //正确,所指向地址上的数据可以改变

总结:

指针常量的申明:const 放在* 和指针名之间 Type * const pointer ;

常量指针的申明:const放在类型说明符之前 const Type *pointer ;


总结:指针指向一块内存,它的内容是所指内存的地址;而引用则是某块内存的别名,引用不改变指向。

参考资料:

http://blog.csdn.net/ostrich_cn/article/details/2295196

http://dev.yesky.com/495/2567995.shtml

http://www.cnblogs.com/skynet/archive/2010/09/22/1832911.html



原创粉丝点击