查看原文
其他

一文搞定C语言const关键字

bug菌 最后一个bug 2022-07-15
    /***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 全部限定为只读,都不可以改写,如果一个开放对应的就可以被修改!
      好了,这里是公众号“最后一个bug”,感谢大家的关注,我们下期见,也欢迎大家分享!

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存