指针与引用的混合使用总结

1.指针是间接访问,因为要用*来读取地址处的数据。将指针作为函数的接收参数是间接引用的方式

引用是直接访问,因为引用是别名,不用任何符号就可以直接读取该对象的数据。将别名作为函数的接收参数是直接引用

 

2.

 

指针

引用

是否可以为空

可以

不可以

是否可以初始化

可以

可以

是否可以赋值

可以

不可以

是否可以访问堆

可以

不可以

不否可以改变对象

可以改变指向的对象,可以改变对象的值

不可以改变引用的对象,可以改变对象的值

 

3.例1:int &r = new int; //错误,不可以直接引用来指向堆中空间

 

4.例2:int *p = new int;

              int &r = *p; //正确,r是通过指针p读取到的未命名int型变量的别名

              r = 4;

              cout << *p ; //输出4

 

5.例3:int  *&r = new int; //正确

创建一个堆中空间,定义r来作为该空间地址的引用,这样r就成了该空间地址的别名。由于引用不能作为指针来使用,所以在&r前面加个*。这样,r变成了一个指针变量,它保存的是堆中空间的地址。所以用*来访问r,*r就是访问堆中数据。用*来读取r地址处的值,*&r就是读取堆中的地址。

 

6.例4:

int main() { /*如果int申请失败->返回空指针->产生一个无用的引用 引用不能为空,用*读取一个无用的引用会引用系统崩溃*/ int *&r = new int; *r = 6; /*r是new int的别名,也是新空间地址的别名,用*来访问r,就是读取新空间中保存的数据*/ cout<<"读取新空间的地址处的值"<<*r<<endl; /*r的值是新空间的地址*/ cout<<"输出新空间的地址"<<r<<endl; /*用*r读取r的地址保存的值,则先用&取地址,再用*读取该地址的值*/ cout<<"读取r地址处的值"<<*&r<<endl; /*r也有自身的地址*/ cout<<"输出r的内存地址"<<&r<<endl; return 0; }

输出:

读取新空间的地址处的值6
输出新空间的地址006A1DF8
输出r的内存地址0012FF40

7.int *p, *q; //p和q都是指针

   int *p,q; //p是指针,q是变量

 

转载于:https://www.cnblogs.com/windmissing/archive/2012/01/16/2559878.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值