一、指针和引用的解释
指针和引用形式上很好区别,但是他们似乎有相同的功能,都能够直接引用对象,对其进行直接的操作,下面简单解释一下指针和引用的区别
指针-对于一个类型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) { // 检查是否为NULL
cout << *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