指针和引用的区别

1 指针和引用的定义

1.1 什么是指针?

指针是一个变量,其值为另一个变量的地址,即,内存位置的直接地址。就像其他变量或常量一样,您必须在使用指针存储其他变量地址之前,对其进行声明。

所有指针的值的实际数据类型,不管是整型、浮点型、字符型,还是其他的数据类型,都是一样的,都是一个代表内存地址的长的十六进制数。不同数据类型的指针之间唯一的不同是,指针所指向的变量或常量的数据类型不同。

1.2 什么是引用?

引用(reference)就是C++对C语言的重要扩充。引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样。引用的声明方法:类型标识符 &引用名=目标变量名。

(1)&在此不是求地址运算,而是起标识作用。

(2)类型标识符是指目标变量的类型。

(3)声明引用时,必须同时对其进行初始化。

(4)引用声明完毕后,相当于目标变量名有两个名称,即该目标原名称和引用名,且不能再把该引用名作为其他变量名的别名。

(5)对引用求地址,就是对目标变量求地址。&ra与&a相等。即我们常说引用名是目标变量名的一个别名。别名一词好像是说引用不占据任何内存空间。但是编译器在一般将其实现为const指针,即指向位置不可变的指针。即引用实际上与一般指针同样占用内存。

(6)不能建立引用的数组。因为数组是一个由若干个元素所组成的集合,所以无法建立一个由引用组成的集合。但是可以建立数组的引用。

(7)引用是除指针外另一个可以产生多态效果的手段。这意味着,一个基类的引用可以指向它的派生类实例。

引用的两个主要用途:作为函数参数以及从函数中返回左值。

2 C++中指针和引用的使用

2.1 指针的使用

使用指针时会频繁进行以下几个操作:定义一个指针变量、把变量地址赋值给指针、访问指针变量中可用地址的值。这些是通过使用一元运算符 * 来返回位于操作数所指定地址的变量的值。但是返回引用要注意,返回的这个变量不能是在这个函数中临时定义的,因为函数是在栈中运行的,执行完之后,其中的变量都会被销毁,如果这样做,引用将代表一个已经被释放掉变量,如果操作该引用,将会出现不可预知的后果。

2.2 引用的使用

引用是C++新增的语法,引用有代表的意思,而指针是一个变量的地址值。在函数返回一个变量时,实质上是将要返回的值复制到临时位置上,然后才是在外部接收该变量,这样做效率低,但如果返回引用,就省去了中间那一步,显然这样效率更高。

3 C++中指针和引用的区别

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

(1)指针是一个变量,只不过这个变量存储的是一个地址,指向内存的一个存储单元;而引用跟原来的变量实质上是同一个东西,只不过是原变量的一个别名而已,在内存占有同一个存储单元。

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

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

(4)指针可以有多级,但是引用只能是一级。

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

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

(7)指针和引用的自增(++)运算意义不一样。指针的自增是对它的内存的位置自增,假如一个数组里的元素是int整型,如果指针起始指向的时数组的0号下标元素,则指针自增一次之后就会指向数组的第二个元素;而引用则时对它的值进行自增,如果0号下标元素的值为25,则引用起始指向0号下标,自增之后,它的值就会变为26。

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

3.2 指针和引用作为函数参数进行传递的区别

(1)指针作为参数进行传递。在指针作为参数进行传递的时候,它会拷贝一份实参,然后它们指向同一块存储内存,但是它俩的变量分别存储在不同的区域。因此修改形参里面的指针的指向时并不会修改实参里面的存储内容,如果想修改的话就得使用引用了。

(2)将引用作为函数的参数进行传递。在讲引用作为函数参数进行传递时,实质上传递的是实参本身,即传递进来的不是实参的一个拷贝,因此对形参的修改其实是对实参的修改,所以在用引用进行参数传递时,不仅节约时间,而且可以节约空间。所以在引用进行参数传递时,事实上传递的是实参本身而不是拷贝副本。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值