C++ 指针和引用的区别

一、指针和引用的解释

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

指针-对于一个类型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



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值