取消对 null 指针“l”的引用。_学习C++ ——指针与引用

7af25fdbcac56472c781b5cc2e641f3c.png

一、指针

指针是c/c++最常用的变量之一,有两种操作:取地址运算符 &、间接寻址运算符 *

#include

结果如下:

Value of var :0x61fe14
Value of p :1

二、引用

引用是C++中特有的概念,非常容易与指针混淆在一起。

先明确引用的定义:

    int *p;//指针
    int m; //被引用变量
    p = &m;
    int &n=m;//引用

值得注意的是,不同于指针,引用必须晚于被引用对象出现,即引用n在被创建时就指向被引用对象,而指针可以先于指向对象被定义

引用有如下限制规则(指针则没有限制):

1. 引用被创建的同时必须被初始化(指针则可以在任何时候被初始化)
2. 不能有 NULL 引用,引用必须与合法的存储单元关联(指针则可以是 NULL)
3. 一旦引用被初始化,就不能改变引用的关系(指针则可以随时改变所指的对象)

从功能上讲,指针是强于引用的,因为指针可以任意指向并改变指向对象,而引用没有这些功能。那引用的功能主要发挥在什么地方呢,我认为在函数的参数传递和返回值上。

众所周知函数的参数有三种传递方式,分别为值传递,指针传递以及引用传递,首先分析这三种传参方式的优缺点,就能发现引用传递的优势所在。

1.值传递

  • 优点:将变量的副本传入函数,所以在需要更改变量值的同时不引起函数外的值的变化时一般多采用值传递的方式。
  • 缺点:1.不能实现对实参的修改。2.除了必须使用值传递的情况,在一般的函数传参中如果使用值传递,在调用函数时首先要进行值的复制,如果变量本身比较大或频繁调用此函数,则都会花费很多时间,降低性能。比如Array类的变量复制时要进行深拷贝,复杂度为

2.指针传递

  • 优点:指针传递本质上只传递变量地址,所以无论何种类型的变量传递时间都相同,大大优化性能,且可以实现对实参的修改。
void fun(int *q)
{
    int x=10;
    q = &x;
}

... ...
int *ptr=NULL;
fun(ptr);
if(ptr==NULL)
   cout<<"ptr is NULL";
... ...
  • 缺点:如上代码所示,通过这种方式改变实参的值并不能成功,ptr仍指向NULL,这是因为将指针ptr当做实参传入fun函数时,指针本身是值传递,即fun函数内的指针q与函数外的ptr指针(并非同一个,只是他们在改变指向之前都指向了同一个地址(NULL),故当修改q的指向时,ptr并不会改变,仍然指向NULL

629cd05cb25e7ce3415c845021b9096e.png
ptr指针与q指针传参后指向改变

3.引用传递

  • 优点:引用具有和指针相同的优点,且引用作为参数进行传递时,实际上传递的并不是实参的拷贝,而是实参本身,因此对形参的修改就是对实参的修改,从而实现修改指针实参的目的。
void 

8837092e2fa6dcd74d0e47c1341d3633.png
引用传递中的指针变量改变

综上可以明确,引用相比指针功能并不全,但引用的优点也很明显,兼具值传递的特性与指针传递的特性,即能修改实参值,同时也能优化时间性能。

所以C++中较为安全、实用的传参方式为引用传递,当不需要或不想改变实参值时,可以使用传常址方式进行参数传递,即:

void fun(const int &q)

用这种方式既可以避免值传递时复制变量耗费时间,又可以避免指针传递时发生变量更改。

参考:

C++ 中指针和引用的区别 | 菜鸟教程​www.runoob.com C++ 指针运算符(& 和 *)​www.runoob.com 浅谈C++中指针和引用的区别 - Matrix海子 - 博客园​www.cnblogs.com 3种C++函数参数传递方式及优缺点​www.jianshu.com
132f969d5ffc3745f72e8a9891f44f5a.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值