C/C++: C++中引用和指针的区别

作者: 治部少辅 | 来源:发表于2018-06-11 15:39 被阅读0次

这篇文章引用自Stack Overflow上的一篇回答:What are the differences between a pointer variable and a reference variable in C++?。同时加进去了一些我的思考

区别

  • 直观上来看,两者的使用形式不同。在使用指针时,若我们想要对其指向数据赋值,需要使用*操作符。例如*p=4,而使用引用的话,直接进行复制操作就行了。int &ri = i; ri = 4;。这种形式上的简化可以带来很大的便利性。
  • 另一个形式的不同在于参数传递时。对于指针而言,在调用形如void f(int *i)的函数时,应当写作f(&i)。而对于引用而言,在调用形如void f(int& i)时,只需要写作f(i)
  • 一个指针变量可以被任意地再次赋值,而引用不可以
  • 指针可以指向空地址,而引用总是指向一个对象
  • 对于引用,无法用&进行取地址操作
  • 对于引用,无法使用算数方法叠加偏移来获取临近地址(but you can take the address of an object pointed by a reference and do pointer arithmetics on it)
  • 有回答提到,引用其实本质上就是const pointer 。不过区别还是存在的。静态指针本身也是可以为空的,但是引用则必然指向一个有效的对象,所以,在形参上使用引用形式可以确保该参数不为空。
  • 在性能层面,二者几乎没有区别:

C++标准并未规定编译器应当以何种方式来实现引用,不过几乎所有的C++编译器都是通过指针来实现引用。如果没有特殊优化,那么引用和指针在消耗的内存上是一样的

引用的设计思想(我的思考)

从上面我们列出的一系列引用和指针的不通之处,我们不难看出引用的设计的两个目的:一是形式的便利性,二是程序运行的安全性。

便利性

使用引用时,可以省去大量的*&符号,使得程序的形式更加简洁。在C++中,这种便利性,也使得操作符重载可以更加自然。例如我们有如下定义的枚举类型

enum day {
    Sunday, Monday //,...
}

如果我们想要该枚举类型支持++操作符,那么我们需要重载这一操作符。如果声明为

day operator++ (day d);

显然无法实现我们的意图。按照传统的C++的想法,此时可以引入指针机制,将操作符重载函数声明为

day operator++ (day* day);

这样声明虽然能够实现我们的功能了,但是我们在使用这个操作符时不得不更改为++&x。这看起来比较诡异。此时使用引用机制就能完美的解决这个问题

day operator++(day& day);

调用的时候使用++x就行了。

这里我们用引用机制完美的解决了这个问题。但是将这一参数形式引入到普通函数的定义上是不合适的。在普通的函数定义中,如果参数是指针式的,那么我们在传递参数的时候需要显式的使用到&。这可以提醒我们我们传递的是指针,意味着这将可能导致我们传递的变量可能在函数内部被修改。在采用引用形式后,这一隐含信息就难以发现了。

安全性

由于引用不能是空的,而且不可以被再次赋值而指向另一个对象,这个特性可以带来变成时候的稳健性,使得过去一些在运行阶段才会暴露出的bug(例如像一个逻辑上不接受NULL的函数传入了NULL参数)能够在编译阶段暴露处理啊。

相关文章

  • C++基础

    C++ 值传递、指针传递、引用传递详解C++中引用传递与指针传递区别 引用传递和指针传递的区别 引用的规则:(1)...

  • 指针和引用的区别

    参照lyd_253261362的专栏的文章详细介绍=====c++中的引用与指针的区别 c++中的引用与指针的区别...

  • 指针和引用的辨析

    先来看两个图 指针与引用的区别 1.指针在C和C++中均有,而引用是C++独有的特性(*指针申明符号,&引用申明符...

  • java中的引用与c++中的指针的区别

    java中的引用与c++中的指针的区别 Java的引用和C++的指针都是指向一块内存地址的,通过引用或指针来完成对...

  • C++知识点

    C++基本方法: C++ memcpy C++基本特性: C++引用(vs指针) C++指针 C++封装: 将...

  • C++入门系列博客三 引用和指针

    C++ 引用和指针 作者:AceTan,转载请标明出处! 引用和指针对于C++来说很重要,是学习C++绕不过去的一...

  • C/C++ basis 01

    1. C和C++区别 2. 指针和引用 sizeof(引用)等于 引用指向对象的大小。 对比值传递,引用传递(引用...

  • 常见问题

    c++中,引用和指针的区别是什么? C++ primer 中对 对象的定义:对象是指一块能存储数据并具有某种类型的...

  • C++中的引用和指针

    C++ 引用与指针的比较 引用是 C++ 中的概念,初学者容易把引用和指针混淆一起。 以下程序中,n 是m的一个引...

  • C++之指针和引用

    指针和引用的区别? 在C++的编码中我们发现很多地方都大量地使用引用,能用指针实现的功能改用引用几乎也能实现,甚至...

网友评论

    本文标题:C/C++: C++中引用和指针的区别

    本文链接:https://www.haomeiwen.com/subject/nxdheftx.html