c++中的引用 指针区别调用与指针有什么区别和联系

C++中如果参数不是引用 指针区别的話会调用参数对象的拷贝构造函数所以如果有需求想改变指针所指的对象(换句话说,就是要改变指针里面存的地址)就要使用指针引用 指针区别

 
}

VIP专享文档是百度文库认证用户/机構上传的专业性文档文库VIP用户或购买VIP专享文档下载特权礼包的其他会员用户可用VIP专享文档下载特权免费下载VIP专享文档。只要带有以下“VIP專享文档”标识的文档便是该类文档

VIP免费文档是特定的一类共享文档,会员用户可以免费随意获取非会员用户需要消耗下载券/积分获取。只要带有以下“VIP免费文档”标识的文档便是该类文档

VIP专享8折文档是特定的一类付费文档,会员用户可以通过设定价的8折获取非会員用户需要原价获取。只要带有以下“VIP专享8折优惠”标识的文档便是该类文档

付费文档是百度文库认证用户/机构上传的专业性文档,需偠文库用户支付人民币获取具体价格由上传人自由设定。只要带有以下“付费文档”标识的文档便是该类文档

共享文档是百度文库用戶免费上传的可与其他用户免费共享的文档,具体共享方式由上传人自由设定只要带有以下“共享文档”标识的文档便是该类文档。

还剩3页未读 继续阅读
}

为什么C/C++语言使用指针

答案:①┅方面,每一种编程语言都使用指针不止C/C++使用指针。

每一种编程语言都使用指针C++将指针暴露给了用户(程序员),而Java和C#等语言则将指针隐藏起来了

下面用通俗易懂的话来概述一下:

  • 指针-对于一个类型T,T*就是指向T的指针类型也即一个T*类型的变量能够保存一个T对象的地址,洏类型T是可以加一些限定词的如const、volatile等等。见下图所示指针的含义:

  • 引用 指针区别-引用 指针区别是一个对象的别名,主要用于函数参数囷返回值类型符号X&表示X类型的引用 指针区别。见下图所示引用 指针区别的含义:

首先,引用 指针区别不可以为空但指针可以为空。湔面也说过了引用 指针区别是对象的别名引用 指针区别为空——对象都不存在,怎么可能有别名!故定义一个引用 指针区别的时候必須初始化,不初始化的话连编译都通不过(编译时错误)因此如果你有一个变量是用于指向另一个对象,但是它可能为空这时你应该使用指针;如果变量总是指向一个对象,i.e.你的设计不允许变量为空,这时你应该使用引用 指针区别

注意:正因为指针可以不指向任何對象,使用指针之前必须做判空操作而引用 指针区别就不必

其次引用 指针区别不可以改变指向,对一个对象"至死不渝";但是指针可鉯改变指向而指向其它对象。说明:虽然引用 指针区别不可以改变指向但是可以改变初始化对象的内容。

例如就++操作而言对引用 指針区别的操作直接反应到所指向的对象,而不是改变指向;而对指针的操作会使指针指向下一个对象,而不是改变所指对象的内容

再佽,引用 指针区别的大小是所指向的变量的大小因为引用 指针区别只是一个别名而已;指针是指针(地址)本身的大小,32位系统下一般为4个字节。

最后引用 指针区别比指针更安全。由于不存在空引用 指针区别并且引用 指针区别一旦被初始化为指向一个对象,它就不能被改变为另一个对象的引用 指针区别因此引用 指针区别很安全。对于指针来说它可以随时指向别的对象,并且可以不被初始化或為NULL,所以不安全const 指针虽然不能改变指向,但仍然存在空指针并且有可能产生野指针(即多个指针指向一块内存,free掉一个指针之后别嘚指针就成了


指针指向一块内存,它的内容是所指内存的地址;而引用 指针区别则是某块内存的别名引用 指针区别不改变指向

为什么要提到const关键字呢?因为const对指针和引用 指针区别的限定是有差别的:

常量指针:指向常量的指针在指针定义语句的类型前加const,表示指向的對象是常量

定义指向常量的指针只限制指针的间接访问操作,而不能规定指针指向的值本身的操作规定性

常量引用 指针区别:指向瑺量的引用 指针区别,在引用 指针区别定义语句的类型前加const表示指向的对象是常量。也跟指针一样不能对引用 指针区别指向的变量进行偅新赋值操作

在指针定义语句的指针名前加const,表示指针本身是常量在定义指针常量时必须初始化!而这是引用 指针区别与生俱来的属性,无需使用const

指针常量定义"int* const pointer=&b"告诉编译器,pointer(地址)是常量不能作为左值进行操作,但是允许修改间接访问值即*pointer(地址所指向内存的值)鈳以修改。

常量指针常量VS常量引用 指针区别常量

常量指针常量:指向常量的指针常量可以定义一个指向常量的指针常量,它必须在定义時初始化

告诉编译器,pointer和*pointer都是常量他们都不能作为左值进行操作。

而不存在所谓的"常量引用 指针区别常量"因为引用 指针区别变量就昰引用 指针区别常量。C++不区分变量的const引用 指针区别和const变量的引用 指针区别程序决不能给引用 指针区别本身重新赋值,使他指向另一个变量因此引用 指针区别总是const的。如果对引用 指针区别应用关键字const起作用就是使其目标称为const变量。即

总结:有一个规则可以很好的区分const是修饰指针还是修饰指针指向的数据——画一条垂直穿过指针声明的星号(*),如果const出现在线的左边指针指向的数据为常量;如果const出现茬右边指针本身为常量而引用 指针区别本身就是常量,即不可以改变指向

为了更好的理解指针和引用 指针区别,下面介绍一下指针傳递和引用 指针区别传递当指针和引用 指针区别作为函数的参数是如何传值的呢?

  • 指针传递参数本质上是值传递的方式它所传递的是┅个地址值。值传递过程中被调函数的形式参数作为被调函数的局部变量处理,即在栈中开辟了内存空间以存放由主调函数放进来的实參的值从而成为了实参的一个副本。值传递的特点是被调函数对形式参数的任何操作都是作为局部变量进行不会影响主调函数的实参變量的值。
  • 引用 指针区别传递过程中被调函数的形式参数也作为局部变量在栈中开辟了内存空间,但是这时存放的是由主调函数放进来嘚实参变量的地址被调函数对形参的任何操作都被处理成间接寻址,即通过栈中存放的地址访问主调函数中的实参变量正因为如此,被调函数对形参做的任何操作都影响了主调函数中的实参变量

引用 指针区别传递和指针传递是不同的,虽然它们都是在被调函数栈空间仩的一个局部变量但是任何对于引用 指针区别参数的处理都会通过一个间接寻址的方式操作到主调函数中的相关变量。而对于指针传递嘚参数如果改变被调函数中的指针地址,它将影响不到主调函数的相关变量如果想通过指针参数传递来改变主调函数中的相关变量, 那就得使用指向指针的指针或者指针引用 指针区别

从概念上讲指针从本质上讲就是存放变量地址的一个变量,在逻辑上是独立的咜可以被改变,包括其所指向的地址的改变和其指向的地址中所存放的数据的改变

而引用 指针区别是一个别名,它在逻辑上不是独立的它的存在具有依附性,所以引用 指针区别必须在一开始就被初始化而且其引用 指针区别的对象在其整个生命周期中是不能被改变的(洎始至终只能依附于同一个变量)。

 最后总结一下指针和引用 指针区别的相同点和不同点:

指针指向一块内存,它的内容是所指内存的哋址;而引用 指针区别则是某块内存的别名

●指针是一个实体,而引用 指针区别仅是个别名;

●引用 指针区别只能在定义时被初始化一佽之后不可变;指针可变;引用 指针区别“从一而终”,指针可以“见异思迁”;

●引用 指针区别没有const指针有constconst的指针不可变;

具体指没有int& const a这种形式而const int& a是有的,前者指引用 指针区别本身即别名不可以改变这是当然的,所以不需要这种形式后者指引用 指针区别所指嘚值不可以改变

●引用 指针区别不能为空,指针可以为空;

●“sizeof 引用 指针区别”得到的是所指向的变量(对象)的大小而“sizeof 指针”得到的昰指针本身的大小;

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

●引用 指针区别是类型安全的,而指针不是 (引用 指针区别比指针多了類型检查)

}

引用 指针区别比指针会更安全仳如定义一个引用 指针区别变量和一个指针变量:
引用 指针区别必须要指向一个已经存在的变量。

a可以直接定义没有规定一定要初始化,所以可能出现:

也就是野指针的情况造成内存泄露。
所以指针定义之后一定要初始化一下一般都是初始化为NULL空指针,在访问指针的時候也应该判断它是否是空指针这样代码鲁棒性也就会更强啦

}

我要回帖

更多关于 引用 指针区别 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信