Const

2022-10-10
目的
常量是指程序执行过程中,值不发生改变
分类
1. 直接常量:也称为字面常量,可以直接拿来使用
. 字符常量:'a';字符常量以ASCII码来表示,本质上还是一个int数字,如符号常量'a'实际上是整型97
. 字符串常量:"hello world"
. 整数常量:12
. 浮点数常量:-1.414
. 布尔常量:false
. 空常量:NULL
2. 符号常量:宏,原样替换,注意使用()来区分运算的优先级;符号常量必须先定义define再使用
#define unit 54414
[]其实还是可以修改的
. 使用变量名限制了内存中内容的修改,但是没有限制使用指针对内容的修改
int main()
{
    const int a = 10;
    printf("%d\n", a);
    int *p = &a;
    *p = 12;
    printf("%d\n", a);
    exit(0);
}
//warning: initialization discards 'const' qualifier from pointer target type
使用
[]数据不变?指向不变?
[]修饰哪个就限制哪个;后面跟什么就限制什么;
[]特别的,对指针而言,先看到const就是常量指针;先看到指针就是指针常量
//case 1:修饰的是a,不允许修改a的值
const int a = 10;
//error: assignment of read-only variable 'a'
a = 11;
           
//case 2:修饰的是*p,不允许修改*p的值,也就是不允许使用指针变量修改数据;但是指针可以指向其它数据
//常量指针:同普通常量一样,内容不可以变
int a = 10;
const int *p = &a;
a = 12;
//error: assignment of read-only location '*p'
//expression must be a modifiable lvalue
*p = 10;
            
//case 3:修饰的是p,指针指向的地址不能变,只能在声明的时候给指针赋值,后面就不可乱指,指向NULL也不可以
//指针常量:指针指向不可以变,始终指向某个存储单元,但是其中的内容可以变
//指针指向固定,本质上是为了加快对数据的访问
int a = 10;
//声明即赋值OK
int *const p = &a;
//error: assignment of read-only variable 'p'
p = &a;
            
//case 4:既不可以修改指向,也不可以修改内容
//对数据上锁,提示安全
int num = 100;
int n = 200;
const int *const p = #
//地址修改告警
p = &n;
//内容修改告警
*p = 200;
应用
1. 函数封装
. 不允许破坏用户参数
. 更多信息,请访问 C 标准库 - 参考手册
FILE *fopen(const char *filename, const char *mode)
char *strcpy(char *dest, const char *src)
2. 保护数据
3. 保护指向
4. 限制操作