前言
- const 的作用很多,而且在被用作 常量指针 和 指针常量 的时候经常容易搞混,今天就来总结一下 所有 const 的用法;
一、const 在普通变量中的应用
1、修饰内置类型
i)左右皆可
- const 修饰内置类型时,位置出现在 变量类型 的左边或者右边,其含义一样,代表被修饰的对象是一个常量,生命周期内不能被改变;
const int maxn = 1024;
int const maxm = 1024;
复制代码
ii)常量的非法修改
- 直接通过赋值修改常量,编译器会报错;
- 但是我们可以通过取地址的方式取得常量的地址,然后再强转成 int 指针,再在对应地址上去取值修改,然后在 watch 窗口观察,发现变量的值的确被修改了!!!但是用 printf 打印出来还是原来的值,所以说明这是一种未定义行为,编译器没想到你会干出这种事,写代码的时候应该坚决避免;
const int maxn = 1024;
*((int *)&maxn) = 1;
printf("%d\n", maxn); // 1024
复制代码
2、修饰指针类型
i)常量指针
- 定义:是一个指针,指针变量指向常量;
- 记忆方法:常量(const)在指针(*)左边,所以从左往右跟我读:常量指针!
- 特性:指向的对象不可变;类型 和 const 的相对位置可以交换;
const int cInt = 1024;
const int* p = &cInt;
*p = 43; // 错误行为,企图修改指针指向对象
复制代码
ii)指针常量
- 定义:是一个常量,指针常量指向变量;
- 记忆方法:指针(*)在常量(const)左边,所以从左往右跟我读:指针常量!
- 特性:指针本身不可变;
int iInt;