美文网首页
const扫盲

const扫盲

作者: 李永开 | 来源:发表于2022-06-24 12:00 被阅读0次

    一.const的使用

    const只修饰const 右边的值

    const int *p0 = &a;
    拆解: const 右边是int *p0,去除int,所以const修饰的是*p0
    *p0不能被修改:不能修改p0所指向的内容,
    但p0的指向可以修改:p0的指向可以被修改
    int *const p0 = &a;
    p0不能被修改:p0的指向不可以被修改,
    *p0可以被修改:p0指向的内容可以被修改

    int a = 0;
    const int *p0 = &a;            //被const修饰,*p0变成常量不能被修改,p0可以被修改
    int const *p1 = &a;            //*p1不能被修改,p1可以被修改
    int * const p2 = &a;          //p2不能被修改, *p2可以被修改
    const int * const p3 = &a;    //p3和*p3都不能被修改(左边const修饰*p3,右边修饰p3)
    int const * cosnt p4 = &a;    //p4和*p4都不能被修改,都变成了常量
    
    • const全局变量在常量区,不能修改(被操作系统限制)
    • const局部变量在栈区,可以通过指针修改

    二. extern

    对于有必要在文件间共享的const变量,在const变量定义和声明时添加extern关键字即可

    • .h文件
      extern const int test_extern_const;
    • .m文件
      extern const int test_extern_const = 0;

    三. typedef遇到const

            typedef char * lykChar;
            char string[4] = "abc";
            
            const char *p1 = string;
            char * const p2 = string;
            const lykChar p3 = string;
            
            p1++;           //OK
    //        *p1 = "efg";  //error: Read-only variable is not assignable
    //        p2++;         //error: Cannot assign to variable 'p2' with const-qualified type 'char *const'
    //        *p2 = "efg";  //OK
    //        p3++;         //Cannot assign to variable 'p3' with const-qualified type 'const lykChar' (aka 'char *const')
    //        *p3 = "efg";  //OK
    

    p1和p2没有问题,关键是使用了typedef的p3有点异常。

    typedef char * lykChar;
    const lykChar p3 = string;
    想象中会进行替换展开
    即: const char * p3 = string;
    所以 *p3不可变, p3是可以变的
    
    但是实际结果却是:
    *p3可变,p3不可变
    

    所以,typedefchar *已经定义成一个新的类型lykChar, lykChar和系统的Intlong等是一样的。
    所以:const lykChar p3 = string, 去除掉lykChar, const修饰了p3,p3不可变,而*p3可变。

    相关文章

      网友评论

          本文标题:const扫盲

          本文链接:https://www.haomeiwen.com/subject/irmvvrtx.html