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都不能被修改,都变成了常量
- 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不可变
所以,typedef
将char *
已经定义成一个新的类型lykChar
, lykChar
和系统的Int
,long
等是一样的。
所以:const lykChar p3 = string
, 去除掉lykChar
, const修饰了p3,p3不可变,而*p3可变。