C++引用与指针

1、引用

引用(reference)并非对象,只是为已经存在的对象起了另外一个名字。另外,引用本身不是一个对象,所以不能定义引用的引用。

定义引用时,程序把引用和它的初始值绑定(bind)在一起,而不是将初始值拷贝给引用。一旦初始化完成,引用将和它的初始值对象一直绑定在一起。因为无法令引用重新绑定到另外一个对象,因此引用必须初始化。而且,引用只能绑定在对象上,而不能与字面值或某个表达式的计算结果绑定在一起。

引用正确定义:
int a = 0;
int &a1 = a;

引用错误定义:
int &b; //引用必须初始化
int &c = 0; //引用类型的初始值必须是一个对象
int &d = a1; //引用本身不是一个对象,不能定义引用的引用
double &e = a; //引用类型与所引用对象类型必须保持一致

对常量的引用(reference to const):对常量的引用不能被用作修改它所绑定的对象。
引用类型必须与其所引用对象的类型一致,但有两种情况下例外:
1、在初始化常量引用时允许用任意表达式作为初始值,只要该表达式的结果能转换成引用的类型即可。尤其,允许为一个常量引用绑定非常量的对象、字面值,甚至是个一般表达式:
int i = 42;
const int &r1 = i; //允许将const int& 绑定到一个普通int对象上
const int &r2 = 42; //正确:r2是一个常量引用
const int &r3 = r1 * 2; //正确:r3是一个常量引用
int &r4 = r1 * 2; /错误:r4是一个普通的非常量引用
double dval = 3.14;
const int &ri = dval; //正确:编译器转化过程const int temp = dval; const int &ri = temp;
2、对const 的引用可能引用一个并非const的对象:常量引用仅对引用可参与的操作做出了限定,对于引用的对象本身是不是一个常量未作限定。因为对象可能是个非常量,所以允许通过其他途径改变它的值:
int i = 42;
int &r1 = i; //引用r1绑定对象i
const int &r2 = i; //r2也绑定对象i,但是不允许通过r2修改i的值
r1 = 0; //r1并非常量引用,i的值修改为0
r2 = 0; //错误:r2是一个常量引用

2、指针

指针(pointer)是“指向(point to)”另外一种类型的复合类型。指针存放某个对象的地址,而该地址通常需要使用取地址符(操作符&)获取,反之,则使用解引用符(操作符*)来访问该对象。

指针的值(即地址)应属下列4中状态之一:
(1)指向一个对象;
(2)指向紧邻对象所占空间的下一个位置;
(3)空指针,意味着指针没有指向任何对象;
(4)无效指针,也就是上述情况之外的其他值。

3、引用和指针的区别

(1)指针本身就是一个对象,允许对指针赋值和拷贝,而且在指针的生命周期内它可以先后指向几个不同的对象;而引用只能和它的初始值绑定(bind)在一起;
(2)指针无需在定义时赋初值,而引用则必须进行初始化。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值