C++:指针&引用

引用

  • 引用即别名,并非对象,它只是为一个已经存在的对象所起的另一个名字。
  • 定义引用时,程序把引用和它的初始值绑定在一起,而不是将初始值拷贝给引用,一旦初始化完成,应用将和它的初始值一直绑定在一起,无法重新绑定另一个对象。
  • 引用只能绑定在对象上,而不能与某个字面值或者表达式绑定在一起。
  • 定义了一个引用之后,对其所作的所有操作都是在与之绑定的对象上进行的。
int val=1024;
int &refval=val; //refval指向val(是val的另一个名字)
int &refval; //报错,引用必须初始化

refval=2; //把2赋给refval指向的对象,此处即是赋给了val
int i=refval; //与i=val的执行结果一样

int &refval=10; //错误:引用类型的初始值必须是一个对象

const的引用

  • 把引用绑定到const对象上,称之为对常量的引用,简称“常量引用”。
  • 常量引用不能用作修改它所绑定的对象。
const int ci=1024;
const int &r1=ci;   //引用及其指向的对象都是常量//从一定意义上说所有的引用都是常量
r1=42;              //错误:r1是对常量的引用,不能用作修改它所绑定的对象
int &r2=ci;         //错误:试图让一个非常量引用指向一个常量对象
  • 引用的类型必须与其所引用对象的类型一致,但是在初始化常量引用时允许用任意表达式作为初始值,只要该表达式的结果能转换成引用的类型即可。尤其,允许为一个常量引用绑定非常量的对象、字面值,甚至一个一般表达式。
int i=42;
const int &r1=i;        //正确 允许将const int&绑定到一个普通int对象上
const int &r2=42;       //正确
const int &r3=r1*2;     //正确
int &r4=r1*2;           //错误 r4是一个普通非常量引用
  • 对const的引用可能引用一个并非const的对象。必须认识到,常量引用仅对引用可参与的操作做出了限定,对于引用的对象本身是不是一个常量未作限定。因为对象也可能是个非常量,所以允许通过其他途径改变它的值。
int i=42;
int &r1=i;        //引用r1绑定对象i
const int &r2=i;  //r2也绑定对象i,但是不允许通过r2修改i的值
r1=0;             //r1并非常量引用,可以通过r1修改i的值,i的值修改为0
r2=0;             //r2是一个常量引用

 

指针

  • 指针是“指向”另外一种类型的复合类型。
  • 指针存放某个对象的地址,要想获取指针,需要使用取地址符&
  • 如果指针指向了一个对象,则使用解引用符(*)来访问该对象。
  • 建议初始化所以指针,如果实在不清楚指针应该指向何处,就把它初始化为nullptr或者0。
int val=42;
int *p=&val; 
cout<<*p; //由符号*得到指针P所指的对象,输出42
  • 空指针:空指针不指向任何对象,生产空指针的方法有:
int *P1=nullptr; //推荐
int *P2=0;
int *P3=NULL; //首先需要#include cstdlib
  • 有时要搞清楚一条赋值语句到底是改变了指针的值还是改变了指针所指对象的值不太容易,最好的办法就是记住赋值永远改变的是等号左侧的对象。
int *pi=0;
pi=&val; //pi的值被改变,现在pi指向了val
*pi=0; //val的值被改变,指针pi并没有被改变
  • void*是一种特殊的指针类型,可用于存放任意对象的地址。

指向常量的指针

  • 指向常量的指针:不能用于改变其所指的对象。要想存放常量对象的地址,只能使用指向常量的指针(而指向常量的指针可以指向非常量对象)。和常量引用一样,指向常量的指针也没有规定其所指的对象必须是一个常量。所谓指向常量的指针仅仅要求不能通过该指针改变对象的值,而没有规定那个对象的值不能通过其他途径改变。

const指针(常量指针)(*const)

  • 注意:常量指针是指指针本身就是一个常量对象,而常量引用是指引用指向一个常量对象,引用本身并不是一个对象。
  • 常量指针必须初始化,一旦初始化完成,它的值就不能再改变了(不变的是指针本身,不能改变指针的指向,而不是指针指向的那个值,仍然可以通过指针修改对象的值)。
int errNumb=0;
int *const curErr=&errNumb;  //curErr将一直指向errNumb
errNumb=42;     //正确,errNumb是一个非常量对象

const double pi=3.14159;
const double *const pip=&pi;   //pip是一个指向常量对象的常量指针 pi的值不可改变 pip的指向也不可改变

引用和指针的区别

  • 引用本身不是一个对象,不能定义引用的引用以及指向引用的指针。而指针本身就是一个对象,允许对指针拷贝的赋值,允许定义指向指针的指针和指向指针的引用。
  • 引用初始化后不可改变,而在指针的生命周期内,它可以先后指向几个不同的对象。
  • 引用必须被初始化,而指针无须在定义时赋初值,和其他内置类型一样,在块作用域内定义的指针如果没有初始化,也将拥有一个不确定的值。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值