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)补充 不能建立数组的引用,指针是可以代表数组的,指向数组的指针是数组的首地址,但是引用是不可以的。

本文链接:https://my.lmcjl.com/post/1855.html

展开阅读全文

4 评论

留下您的评论.