const扫盲

2022-06-24  本文已影响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都不能被修改,都变成了常量

二. extern

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

三. 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可变。

上一篇下一篇

猜你喜欢

热点阅读