c语言下对局部const的修改
void test() {
const int m_b = 100; //伪常量。
int *p = &m_b;
*p = 200;
printf("%d\n", m_b);
}
在c语言下,这段代码是可以修改变量m_b的值的,因为此时m_b是分配在栈上的一个变量,而不是分配在常量区。我们可以把这种变量称为伪常量。
c++下对局部const的修改
void test() {
const int m_b = 100;
int *p = (int *)&m_b;
*p = 200;
cout << m_b << endl;
}
同样的代码,在c++环境下是否也能够达到修改m_b变量值的效果呢?
答案是否定的。但是这段代码可以编译运行,但是没有修改掉m_b的值。那么上述代码修改的是谁的值呢?
在c++下,写下 const int m_b = 100; 后,m_b不是被分配在栈上,而是在符号表中以键值对的方式存储,在此情况下,m_b是可以被当成变量的,它的值就是100.
而当我们对const修饰的局部变量取地址的时候,其实c++的编译器在内部帮我们做了一些事情。编译器给变量m_b分配了一个临时的内存空间temp。p指针指向的是temp,所以修改的其实是temp的值。
总结
在c语言下局部const是伪常量,而在c++下,局部const可以看成是个常量。