const的几种常用形式
1. const 修饰常量
const 修饰常量,值无法修改
const int a = 2;//和下面一种等价,int 和 const位置可以交换
int const b = 2;
2. 指向常量的指针
const 修饰指针指向的常量,值无法修改 ,指针可以修改指向
const int* d = new int(2);//和下面一种等价,const 和 int同样可以交换位置
int const* c = new int(2);
3. 指向常量的指针常量
// 常量指针指向常量,指针和常量 都无法修改
int const* const e = new int(2);
左定值,右定向
const在星号的左边不能改变字符串常量的值
const在星号的右边不能改变指针的指向
编译器对常量会进行优化
可以参考下面的链接。
https://blog.youkuaiyun.com/dd864140130/article/details/49495259
如何修改const修饰的变量的值
1. 如果const常量是在堆栈中,那么可以通过操作const变量所在内存修改值
#include<iostream>
using namespace std;
int main() {
const int a = 3;
int* p = (int*)&a;
*p = 2333;
cout << a << endl;//输出了3,好像并没有被修改
return 0;
}
上面的a按理来说应该被修改成2333,但是没有修改成功。原因是编译器进行了常量优化。我们可以添加volatile关键字让编译器不要优化a常量。
#include<iostream>
using namespace std;
int main() {
const int volatile a = 3;
int* p = (int*)&a;
*p = 2333;
cout << a << endl;//输出了2333,修改成功
return 0;
}
2. 如果const变量是修饰全局变量
- static无论是全局变量还是局部变量都存储在全局/静态区域,在编译期就为其分配内存,在程序结束时释放。
- const全局变量存储在只读数据段,编译期最初将其保存在符号表中,第一次使用时为其分配内存,在程序结束时释放。
- const局部变量存储在栈中,代码块结束时释放。
- 全局变量存储在全局/静态区域,在编译期为其分配内存,在程序结束时释放。
- 局部变量存储在栈中,代码块结束时释放。
- 当全局变量和静态局部变量未赋初值时,系统自动置为0。
因此,const修饰的全局变量内存为只读,无法通过操作内存来修改值,虽然编译时不会报错,但是运行时程序会崩溃。