• C语言-入门-const关键字(十九)


    前沿

    const是constant的简写,用来定义常量,它限定一个变量不允许被改变,产生静态作用。const最开始推出的目的是为了取代预编译指令,取长补短。好处如下:

    1. 定义const常量,具有不可变性
    2. 便于进行类型检查,使编译器对处理内容有更多了解,消除了一些隐患。
    3. 可以避免意义模糊的数字出现,同样可以很方便地进行参数的调整和修改。
    4. 可以保护被修饰的东西,防止意外的修改,增强程序的健壮性。
    5. 可以节省空间,避免不必要的内存分配。
    6. 高了效率。编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表 中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高。

    如何使用const?

    常量一般常量是指简单类型的常量。这种常量在定义时,修饰符const可以用在类型说明符前,也可以用在类型说明符后

    int const x=2; 
    //或 
    const int x=2;
    
    • 1
    • 2
    • 3

    当然,我们可以偷梁换柱进行更新: 通过强制类型转换,将地址赋给变量,再作修改即可以改变const常量值

     // const对于基本数据类型, 无论写在左边还是右边, 变量中的值不能改变
        const int a = 5;
        // a = 666; // 直接修改会报错
        // 偷梁换柱, 利用指针指向变量
        int *p;
        p = &a;
        // 利用指针间接修改变量中的值
        *p = 10;
        printf("%d\n", a); 
        printf("%d\n", *p);
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    修饰常数组(值不能够再改变了)定义或说明一个常数组可采用如下格式:

    int const a[5]={1, 2, 3, 4, 5};
    const int a[5]={1, 2, 3, 4, 5};
    
    • 1
    • 2

    修饰函数的常参数const修饰符也可以修饰函数的传递参数,告诉编译器Var在函数体中的无法改变,从而防止了使用者的一些无 意的或错误的修改。

    void Fun(const int var){
    //函数内部只是读取var 不能修改var
    } 
    
    • 1
    • 2
    • 3

    修饰函数的返回值: const修饰符也可以修饰函数的返回值,使得调用者不能修改函数返回值,格式如下:

    const int Fun1();
    const MyClass Fun2();
    
    • 1
    • 2

    修饰指针
    使用const修饰指针不同位置会导致不同的变化

    const int *A; //const修饰指针,A可变,A指向的值不能被修改
    
    • 1
    int const *A; //const修饰指向的对象,A可变,A指向的对象不可变
    
    • 1
    int *const A; //const修饰指针A, A不可变,A指向的对象可变
    
    • 1
    const int *const A;//指针A和A指向的对象都不可变
    
    • 1

    技巧:

    • 先看*的位置
    • 如果const 在 *的左侧 表示值不能修改,但是指向可以改。
    • 如果const 在 *的右侧 表示指向不能改,但是值可以改
    • 如果在*的两侧都有const 标识指向和值都不能改。

    修饰全局变量

    全局变量的作用域是整个文件,且全局变量的生存周期为程序运行的整个过程,所以我们应该尽量避免使用全局变量,一旦某个函数改变了全局变量的值,会影响到其他引用这个变量的函数,是一个很隐蔽的操作(很难找到谁改的)如果一定要用全局变量,应该尽量的使用const进行修饰,防止不必要的人为修改

    typedef和#define常亮操作不同

    typedef   int * pint;
    #define  PINT  int *
    int main(int argc, char* argv[])
    {
        int i1 = 1, i2 = 2;
        const  pint a=&i1;   //p1本身地址不可更改,p1指向的内容可以更改
        const  PINT b=&i2;//p2本身地址可以更改, p2指向的内容不能更改
    
    //    *a=3; //换内容是可以的
    //    a=&i2; //换地址不行 Cannot assign to variable 'a' with const-qualified type 'const pint' (aka 'int *const')
        printf("%d\n", *a);
    
    //    b=&i2;  // 换地址是可以的
    //    *b=1; //换内容不行 ,Read-only variable is not assignable
        printf("%d\n", *b);
        return 0;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    所以建议在使用typedef 定义指针的时候就指定const 比如:typedef const int * pint; 这样之后在使用的时候就不能改变地址内的值了

    在这里插入图片描述

    点赞 -收藏-关注-便于以后复习和收到最新内容
    有其他问题在评论区讨论-或者私信我-收到会在第一时间回复
    在本博客学习的技术不得以任何方式直接或者间接的从事违反中华人民共和国法律,内容仅供学习、交流与参考
    免责声明:本文部分素材来源于网络,版权归原创者所有,如存在文章/图片/音视频等使用不当的情况,请随时私信联系我、以迅速采取适当措施,避免给双方造成不必要的经济损失。
    感谢,配合,希望我的努力对你有帮助^_^
  • 相关阅读:
    MySQL之MHA高可用配置及故障切换
    电子邮件营销初学者指南(二):如何开始与撰写
    mysql8其它新特性
    networkx绘制度分布
    黑豹程序员-架构师学习路线图-百科:Git/Gitee(版本控制)
    A公司与B公司xx项目互通测试解决方案模板
    苹果电脑为什么无法删除U盘的文件?mac怎么删除移动硬盘里的文件
    HowHelp是干什么的?
    XILINX MPSOC通过VPSS实现输出缩放,像素格式转换
    Python 反爬虫与反反爬虫
  • 原文地址:https://blog.csdn.net/weixin_45203607/article/details/126345065