微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > C++中const与指针、引用的分析

C++中const与指针、引用的分析

时间:12-01 来源:互联网 点击:
C++中函数的参数相比C语言中的函数参数要复杂的多,其中主要的原因是C++中引入了引用以及const限定符。这两个对象的引入,使得C++中的函数参数变得异常的复杂多变,每一种类型都具有比较适合的使用范围。

本文详细的分析const与指针、引用在一起存在情况下的情况分析。

首先介绍引用
引用是对象的别名,必须在初始化的过程中与一个具体的对象绑定起来,绑定完成以后就再也不能够修改了,引用貌似和指针有很大的相似性,但是引用是引用,是一个别名,而指针是一个变量,只是变量中保存的是对象的地址,引用并不分配新的内存空间。因此一个引用与一块内存区域绑定,是这块内存区域的别名,就如同数组名一样,数组是内存中的一块区域,数组名是这块区域的名字,但是在内存中并不存在额外的区域保存数组名。引用就是一块内存区域的别名。C++中变量实质上就是一块内存区域,我们在用&i就可以得到变量i的地址,也就是说变量是这块区域的名字。对变量的操作实质上就是对这块内存中内容的操作。别名是这块区域的另一个名字。采用任何一个名字对这块区域修改都会影响区域的内容。

int vari = 10;
int &refr = vari;
vari = 20;
cout < refr < " " < vari < endl;
refr = 30;
cout < refr < " " < vari < endl;

上面的int &refr = vari实质上就是变量vari的别名,也就是保存vari变量地址的别名,这个地址中保存的是一个int类型的数据,数据可以通过vari来操作,可以修改。因为refr是一个别名,也可以通过该别名对这块内存区域进行操作。也就是说别名的操作就是针对一块特定的内存区域,这个通过变量操作的效果是一致的。
其次说说const限定符
const的引入使得在函数操作中的一些问题复杂了,但是更加的合理了,const限定符是指上是指一个常量。这个常量在一般的情况下就是限定变量不能修改,但是当这个限定符与引用、指针结合在一起时,使得很多的问题不在明朗。

1、const与指针

int *ptr;
const int *ciptr;
int const *icptr;
int * const cptr;
const int * const cicptr;

上面是关于const与指针结合时的各种情况,这并不只是C++中经常遇到的问题,在C语言中也会有类似的讨论,虽然const并不是C语言中的关键字。
int * ptr 是指定义一个指向int 类型的指针ptr。
const int *ciptr 是指定义一个指向const int 类型的指针ciptr,这是const 限定的是(* ciptr),也就是对指针解引用,即const限定的就是数据本身,而非指针。所以ciptr是一个指向常int型数据的指针。
int const * icptr其实和上面的const int *ciptr是一致的因为const只是一个限定符,在int前还是后都 没有影响,他限定的仍然是(*icptr),并不是icptr,也就是icptr也是指向常int型数据的指针,也就是说在icptr这个指针看来,它指向的数据是常数,是不能改变的,但是是否真的不能改变,需要依据实际的类型的分析,只是不能通过这个指针来改变。也就是说该指针是一个自以为自己指向常量的指针。
int * const cptr 这时候我们还是结合const的位置分析,const限定的是cptr,cptr我们可以知道是一个指针,也就是说const限定的是一个指针,而不是指针指向的数据,也就是说这种定义实质上是定义一个常指针,也就是指针指向的地址是不变的,也就是cptr是不能被赋值的,不能采用这个指针指向其他的对象或者地址。但是这个地址中的数据并不是常数,是可以改变的,可以通过对*cptr进行修改。这种指针实质上也就使得指针的效果大大减小,并不常用。
const int * const cicptr 这种定义结合上面的分析我们知道是一个指向常量的常指针,也就说这个指针指向的地址是一个常地址,指针不能指向其他的对象或者地址。同时对指针cicptr来说,我指向的这个地址中的内容也是不能修改的,是一个常量,是不能修改的,但是该地址的数据能否修改还需要进行实际的分析。

2、关于指针的初始化、赋值的问题
对于const类型的数据,如果需要定义指针,这时候只能定义const类型的数据,这是为什么呢?因为对于const对象来说,数据是肯定不能修改的,如果定义指向非const的指针,程序员可能就会通过指针来修改对象的值,但是const对象是不能被修改的,肯定会出现错误。因此const的变量只能采用指向常量的指针来指向。一般来说如果将一个非const指针指向了一个const对象,编译的过程中就会抛出如下的错误:

invalid conversion from ‘const int*’ to ‘int*’

但是对于指向常量的指针并不一定指向的数据就是常量,这是一个非常重要的技术点,

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top