C++ 指针和引用的区别

指针是C系语言的一大特色,也在很大程度上体现着C/C++的精髓,一个数据对象的内存地址称为该数据对象的指针。本质上指针是一个变量,所以它有自己的类型,这个类型决定了它可以指向何种类型的数据对象;之所以使用数据对象这个说法,是因为指针能够代表的远远不止变量,还包括数组,数组元素,结构体,甚至函数。

引用是C++对C语言的一个补充,它的作用是为一个变量起一个别名。 个人理解:很多时候下把“引用”当做一个名词来理解会更顺畅一些,比如说定义一个引用,某某的引用,当然这个是个人观点,并没有严格的论证。

那么从指针与引用的区别的角度考虑二者的特性的话,有下面几点:

(1)非空区别: 在任何情况下都不能使用指向空值的引用, 一个引用必须总是指向某些对象。 换句话说一个引用在声明的时候就必须要初始化(除了作为函数的参数),而指针是没有这个问题的,我们在定义一个指针但是不让它指向任何对象,是完全可以的:

    //错误,需要初始值
    int &b;
    //正确
    int *p;

因此如果你使用一个变量并让它指向一个对象,但是该变量在某些时候也可能不指向任何对象,这时你应该把变量声明为指针,因为这样你可以赋空值给该变量。 相反,如果变量肯定指向一个对象,例如你的设计不允许变量为空,这时你就可以把变量声明为引用。不存在指向空值的引用这个事实意味着使用引用的代码效率比使用指针要高。

(2)合法性区别: 在使用引用之前不需要测试它的合法性。 相反,指针则应该总是被测试,防止其为空。这个问题和上面的其实是对应的,既然指针在定义的时候可以为空,但是一个为空的指针对实现一个功能是没有用的,为了代码的鲁棒性,我们必须时刻考虑指针为空的情况,这在指针作为函数的参数时尤为常见。

(3)可修改区别: 指针与引用的另一个重要的区别是指针可以被重新赋值以指向另一个不同的对象。 但是引用则总是指向在初始化时被指定的对象,以后不能改变,但是指定的对象其内容可以改变。 由于引用的声明和初始化总是在一起的,所以不可能让一个对象的引用指向另一个,这完全没有道理,假设a的引用是c,那么在执行int &c=b;就重定义了,如果执行c = b;,那么只是把b的值赋值给c,也就是a。

    int a =1;
    int b =2;
    int &c=a;
    int *p=&a;
    cout<<c<<endl;
    cout<<a<<endl;
    c = b;
    p = &b;

    cout<<c<<endl;
    cout<<a<<endl;

(4)应用区别: 以上的特性决定了指针和引用的一些应用上的区别,总的来说,在以下情况下应该使用指针:一是考虑到存在不指向任何对象的可能(在这种情况下,能够设置指针为空),二是需要能够在不同的时刻指向不同的对象(在这种情况下,你能改变指针的指向)。 如果总是指向一个对象并且一旦指向一个对象后就不会改变指向,那么应该使用引用。

(5)补充 不能建立数组的引用,指针是可以代表数组的,指向数组的指针是数组的首地址,但是引用是不可以的。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏java学习

Java基础第五天学习笔记

05.01_Java语言基础(数组概述和定义格式说明)(了解) * A:为什么要有数组(容器) * 为了存储同种数据类型的多个值 * B:数组概念 * 数组...

2787
来自专栏前端杂货铺

类型转换的判定方式

对于“==”,我们肯定不陌生,但是背后的判定机制我们可能不是很熟悉,我现在先举一些例子,最后再总结一下大概的方法: null == undefined // ...

3257
来自专栏程序员互动联盟

【编程基础第十二讲】web开发编程基础--回调函数

存在问题: 我们都知道C语言存在回调函数,那么JavaScript中的回调函数是如何实现的? 如何实施: a.非参数回调函数 这类回调函数大多比较简单,往往传一...

2285
来自专栏编程

Python 迭代器和生成器

来源:田小计划 www.cnblogs.com/wilber2013/p/4652531.html 在Python中,很多对象都是可以通过for语句来直接遍历的...

17910
来自专栏塔奇克马敲代码

第3章 字符串、向量和数组

1646
来自专栏C语言及其他语言

【编程经验】结构体的定义和使用

结构体的定义和使用 结构体与数组类似,都是由若干分量组成的,与数组不同的是,结构体的成员可以是不同类型,可以通过成员名来访问结构体的元素。 ...

33412
来自专栏云瓣

正则&highlight高亮实现(干货)

写完正则表达式以后在浏览器上检测实在是不方便,于是就写了一个JS正则小工具,大大地提高了学习效率。学习之余用正则实现了一个highlight高亮demo,欢迎交...

32912
来自专栏前端知识分享

第149天:javascript中this的指向详解

js中的this指向十分重要,了解js中this指向是每一个学习js的人必学的知识点,今天没事,正好总结了js中this的常见用法,喜欢的可以看看:

562
来自专栏大闲人柴毛毛

稳扎稳打JavaScript(二)——图解对象内存模型

1. 什么是JS对象? 在JS中,对象是一组无序属性的集合。其中,属性可以是基本数据类型、引用类型、函数。如下面这个对象的例子: var chai={ ...

3826
来自专栏吴裕超

总结一下js的原型和原型链

最近学习了js的面向对象编程,原型和原型链这块是个难点,理解的不是很透彻,这里搜集了一些这方面的资料,以备复习所用 一. 原型与构造函数   Js所有的函数都有...

3055

扫码关注云+社区