码迷,mamicode.com
首页 > 其他好文 > 详细

指针和引用的区别

时间:2018-08-07 20:53:02      阅读:131      评论:0      收藏:0      [点我收藏+]

标签:ali   strong   class   返回   区分   其它   不可   出现   改变   

指针和引用的定义和性质区别:

(1)指针:指针是一个变量,只不过这个变量存储的是一个地址,指向内存的一个存储单元;而引用跟原来

的变量实质上是同一个东西,只不过是原变量的一个别名而已。如:

int a=1;int *p=&a;
int a=1;int &b=a;

上面定义了一个整形变量和一个指针变量p,该指针变量指向a的存储单元,即p的值是a存储单元的地址。

而下面2句定义了一个整形变量a和这个整形a的引用b,事实上a和b是同一个东西,在内存占有同一个存储单

元。

(2)引用不可以为空,当被创建的时候,必须初始化,而指针可以是空值,可以在任何时候被初始化。

(3)可以有const指针,但是没有const引用;

(4)指针可以有多级,但是引用只能是一级(int **p;合法 而 int &&a是不合法的)

(5)指针的值可以为空,但是引用的值不能为NULL,并且引用在定义的时候必须初始化;

(6)指针的值在初始化后可以改变,即指向其它的存储单元,而引用在进行初始化后就不会再改变了。

(7)”sizeof引用”得到的是所指向的变量(对象)的大小,而”sizeof指针”得到的是指针本身的大小;

(8)指针和引用的自增(++)运算意义不一样;

(9)如果返回动态内存分配的对象或者内存,必须使用指针,引用可能引起内存泄漏;

指针和引用的相同点:

      两者都是地址的概念,指针指向一块儿内存,其内容为所指内存的地址;引用是某块儿内存的别名。

 区分用指针和引用的不同情况:

使用引用的情况:

        1.常引用,用这种方式声明的引用,不能通过引用对目标变量的值进行修改,从而使引用的目标成为const,达到了引用的安全性,函数体不能对引用型参数修改目标变量。声明方式:const  类型标识符  &引用名 = 目标变量名

        2.作为函数的返回值,当类A的数据成员包含B类的对象,可以在类A中定义一个方法,返回B类的对象的引用,返回的是引用就不会有副本产生,可以直接修改类对应类B的对象。

函数定义时要按以下格式:

    类型标识符  &函数名 (形参列表及类型说明)

    {  函数体  }

引用作为返回值,必须遵守以下规则:

  1.不能返回局部变量的引用,主要原因是局部变量会在函数返回后被销毁,因此被返回的引用就成为了"无所指"的引用,程序会进入未知状态。

  2.不能返回函数内部new分配的内存的引用。虽然不存在局部变量的被动销毁问题,可对于这种情况(返回函数内部new分配内存的引用),又面临其它局面。例如,被函数返回的引用只是作为一个临时变量出现,而没有被赋予一个实际的变量,那么这个引用所指向的空间(由new分配)就无法释放,造成内存泄漏。

使用指针和引用的情况对比:

        1.是考虑到存在不指向任何对象的可能(在这种情况下,能够设置指针为空)

        2.需要能够在不同的时刻指向不同的对象(在这种情况下,能改变指针的指向)。如果总是指向一个对象并且一旦指向一个对象后就不会改变指向,那么就应该使用引用。

        3.重载某个操作符时,应该使用引用。当你知道你必须指向一个对象并且不想改变其指向时,或者在重载操作符并为防止不必要的语义误解时,你不应该使用指针。而在除此之外的其他情况下,则应使用指针。

指针和引用的区别

标签:ali   strong   class   返回   区分   其它   不可   出现   改变   

原文地址:https://www.cnblogs.com/tianzeng/p/9438759.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!