C语言中const的用法详解

2022-12-21 0 1,099

const基本上如是说

const是constant的缩写,用以表述自变量,它限量发行两个表达式不容许被发生改变,产生动态作用。const最开始面世的目地是为了替代预校对命令,互相学习。

与define的对照

define是预校对命令,表述的宏是在后处理期进行的,而const是一般表达式的表述,是黎贞表达式,且是在校对运转期采用的。define表述的是自变量,define表述的宏在校对后消亡了,它不挤占缓存,而const表述的常表达式其本质上仍然是两个表达式,具备表达式的基本上特性,有类别、挤占数据流,除无法作为字符串的宽度,用const表述的常表达式具备宏的缺点,而且采用更方便快捷。define表述的第一类没正则表达式,校对器根本无法机械设备地进行字符串代替,没类别巡查,即会出现“货币乘数难题”或是是“括弧难题”。而const表述的是表达式,有正则表达式。

上面他们从几个方面而言一下const的用语:

润色局部表达式

const int num=5; int const num=5;

这三种读法是一样的,都是表示表达式num的值无法被发生改变,用const润色表达式时,一定要调用,不然后就无法再进行表达式了(前面会讲到一种特定情况)。

接下去看一看const用作润色自变量动态字符串,比如:

const char* str=”techdreamer”;

如果没const的润色,他们可能会在后不知不觉间的修正标识符,比如说str[4]=’D’,这样会导致对黎贞缓存地区的表达式,使流程极度中止。

而加之const润色后,这个严重错误就能在流程被校对的时候立刻被检查和出来,让方法论严重错误在校对期被发现,防止他们在先期中继续debug。

润色全局表达式

全局表达式的返回值是整座文档,且全局表达式的存活周期性为流程运转的整座过程,所以他们应该尽量防止采用全局表达式,一旦某个函数发生改变了全局表达式的值,会影响到其他引用这个表达式的函数,是两个很隐蔽的操作。

如果一定要用全局表达式,应该尽量的采用const进行润色,防止不必要的人为修正,采用 const 润色过的局部表达式就有了动态特性,它的存活周期性也是流程运转的整座过程,虽然有了动态特性,但并不是说它变成了动态表达式。

润色自变量指针与指针自变量

自变量指针

自变量指针是指针指向的内容是自变量,可以有以下三种表述方式。

const int * num; int const * num;

以下两点需要注意:

自变量指针说的是无法通过这个指针发生改变表达式的值,但可以通过其他的引用以发生改变表达式的值。
int cnt=5; const int* num=&cnt; cnt=6;
自变量指针指向的值无法发生改变,但这并不意味着指针本身无法发生改变,自变量指针可以指向其他的地址。
int cnt=5; int tmp=6; const int* num=&cnt; num=&tmp;

指针自变量

指针自变量是指指针本身是个自变量,无法再指向其他的地址,读法如下:

int *const num;

需要注意的是,指针自变量指向的地址无法发生改变,但是地址中保存的数值是可以发生改变的,可以通过其他指向改地址的指针来修正。

int cnt=5; int *tmp=&cnt; int* const num=&cnt; *tmp=6;

区分自变量指针和指针自变量的关键就在于星号的位置,他们以星号为分界线。

如果const在星号的左边,则为自变量指针如果const在星号的右边则为指针自变量

如果他们将星号读作‘指针’,将const读作‘自变量’的话,内容正好符合。

int const * num;是自变量指针,int *const num;是指针自变量。

指向自变量的常指针

还有一种情况是指向自变量的常指针,这相当于是自变量指针与指针自变量的结合,指针指向的位置无法发生改变并且也无法通过这个指针发生改变表达式的值,比如

const int* const num;

这个代表num所指向的第一类的值以及它的地址本身都无法被发生改变

润色函数的形参

根据自变量指针与指针自变量,const润色函数的参数也是分为三种情况

防止修正指针指向的内容
void FUN(char *destin, const char *source);

其中 source 是输入参数,destin 是输出参数。给 source 加之 const 润色后,如果函数体内的语句试图改动 source 的内容,校对器将报错,但反过来是可以的,校对器容许将char *类别的数据表达式给const char *类别的表达式。

防止修正指针指向的地址
void FUN ( int * const p1 , int * const p2 )

指针p1和指针p2指向的地址都无法修正。

以上三种的结合。

在C词汇标准库中,有很多函数的形参都被 const 限制了,上面是部分函数的原型:

size_t strlen ( const char * str ); int strcmp ( const char * str1, const char * str2 ); char * strcat ( char * destination, const char * source ); char * strcpy ( char * destination, const char * source ); int system (const char* command); int puts ( const char * str ); int printf ( const char * format, … );

润色函数的返回值

如果给以“指针传递”方式的函数返回值加 const 润色,那么函数返回值(即指针)的内容无法被修正,该返回值根本无法被赋给加const 润色的同类别指针,比如

const char * FUN(void);

如下语句将出现校对严重错误:

char *str = FUN();

正确的用语是

const char *str = FUN();

思考

C与C++中的const用语有什么区别?校对器会给const表述的表达式分配存储空间吗?const表达式能被其他文档extern引用吗?

参考:C词汇中文网

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务