怎样去使用C语言中的const关键字呢

描述

  /***const是什么?***/    

在C语言中const是一个关键字,const字面的意思是“恒定的,不变的”,其主要的作用是const定义的变量,但又相当于常量,其值不允许被改变。    

值得注意的是:
       
1)const修饰的变量的
生存周期为其定义到整个程序结束运行,不管是全局变量还是局部变量。      

2)对于const变量在
初始化的时候就需要进行按我们的期望进行赋值,其他时候修改则会造成语法错误。      

3)对于
const特性跟编译器相关,不过大部分是一致的!      

4)const是在
编译的时候编译器进行的一些处理!  

 /***如何使用const?***/  

 一、C语言中const修饰的变量占用内存       

我们先看加两个例子:        

下图C语言

编译器

下图C++语言

编译器

我们编译会发现C语言无法通过,主要是原因是我们定义const变量n并不是常量所以编译无法通过。所以用const定义的变量仅仅为只读变量,同样需要占用内存。而C++可以通过,而它相对比较复杂,这里不在展开描述!    

二、const注释函数参数和返回值          

我们通过修饰函数形参来保护传入的参数不被意外修改,有利于程序稳定性。我们一般不会用const修饰值传递,因为值传递是一个赋值的过程,在函数内部修改不会改变其值,所以不是很有意义;一般用const注释指针传递,防止内部修改导致外部变化,比如:void sFuc(const char *des,const char *src);这样就防止了des和src值的意外修改。          

修饰返回值一般用得比较少,采用const修饰返回值一般也不用于值传递,而是多用于指针传递!      


三、const变量能通过指针修改吗?      

我们通过下面两个例子:

编译器

我们会发现两者的区别const一个注释的全局变量一个注释的局部变量,我们编译都能通过,不过使用全部变量的程序运行会报段错误,而局部变量的能够过得正确结果。对于通过指针修改const的值是一种与编译器有关的行为,我们认为可以用指针修改堆栈上的局部变量,而全部变量const修饰以后为只读区域,如果程序访问则会导致异常!     

四、const注释指针的终极奥义

我们把const处把右侧的语句括起来,去掉数据类型,括起来的内容是什么就是什么不能被修改。

如:

1)const int *pVar=&addr;根据上面的方法括起来的内容(* pVar)表示的是指针的内容,那么不能执行*pVar内容的修改,比如说*pVar=123;则编译会报错。不过可以修改指针的地址,比如pVar = &addr2;这样是可以修改的并且我们再次访问pVar的内容则变成了addr2的内容了。              

2)同样int const *pVar=&addr;跟上面是一样的处理办法。              

3)int * const  pVar=&addr;这个刚刚与前面的相反,其括起来的为(pVar)所以值能使用*pVar作为左值,不能修改pVar所指向的地址。                

4)对于const int * const pVar=&addr则都不可进行修改!只能作为右值可读。                

5)我们同样可以扩展下对于二级指针

const char * const * const p 全部限定为只读,都不可以改写,如果一个开放对应的就可以被修改!


审核编辑:刘清

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分