c/c++中修改const修饰的变量

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修饰的全局变量内存为只读,无法通过操作内存来修改值,虽然编译时不会报错,但是运行时程序会崩溃。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值