• const 那点事儿


    修饰变量时 const char 与 char const 是等价的,例如
    1. const char a = 'a';
    2. char const a = 'a';
    表示变量a不能再被赋予其他值.

    到指针时情况有点复杂,有 const 限定指针本身和限定指针指向的内容的区别,同样首先要说明的是
    1. const char *p = "ABC";
    2. char const *p = "ABC";
    这两种写法完全一样,都表示指针 p 指向的内容不能通过指针 p 修改,指针本身是可以指向其他内存地址的,这样说不是很明白,因为"ABC"本身就是常量,不能被修改,还是代码解释吧
    1. char buf1[] = "ABC";
    2. char buf2[] = "DEF";
    3. const char *p = buf1;
    4. *p = 'B'; // 错误,在p看来,buf1的内容是不可改变的,想通过p来修改buf1的内容编译器将报错,事实上buf1的内容是否可变由buf1本身属性决定
    5. p = buf2; // 没问题,指针p本身并不是const
    与此对应还有另一种情况 
    1. char buf1[] = "ABC";
    2. char buf2[] = "DEF";
    3. char * const p = buf1;
    4. *p = 'D'; // 没问题, const 修饰 p 本身,表示p指向的内存地址不能改变,但是内存地址上的内容并没有被限定为const,内容是可以通过p改变的
    5. p = buf2; // 错误,p为常量,初始化后不能被赋予其他值
    一种比较变态的写法
    1. char buf[] = "ABC";
    2. const char * const p = buf; // 这么做以后既不能将p指向其他内存地址,也不能通过p修改buf的内容
    总结来就是 :
    const 在 * 左边时表示指针指向的内容不能通过指针修改,但是指针本身是可变的,它可以指向其他的内存地址(const 限定指向的内容);
    const 在 * 右边时表示指针本身是不可变的,它不能再指向其他的内存地址,但是可以通过指针修改它指向的内容(const 限定指针本身).




  • 相关阅读:
    双11专刊|云原生数据仓库AnalyticDB支撑双11,大幅提升分析实时性和用户体验
    LeetCode_Binary Tree Inorder Traversal
    LeetCode_4Sum
    LeetCode_Add Binary
    LeetCode_Add Two Numbers
    LeetCode_3Sum Closest
    Building CEGUI with Ogre 1.8.1
    LeetCode_3Sum
    LeetCode_Climbing Stairs
    LeetCode_Binary Tree Level Order Traversal
  • 原文地址:https://www.cnblogs.com/mforestlaw/p/5780940.html
Copyright © 2020-2023  润新知