const 大家都很熟悉。修饰变量后,变量的值不可改变。
例如: const int a = 10;
a = 11; //这句话会被编译器报错,因为a是const属性。
那么在后面的程序中,a的值不可改变。
那么我们先看下在C中 const的属性:
#include <stdio.h>
int main(void)
{
const int m_A = 20;
//m_A = 25; //这样修改会报错,因为20是只读变量
//但是如果我们修改成如下这样就可以改变变量m_A的值
int *p = (int *)&m_A;
*p = 25;
printf("*p = %d, m_A = %d\n", *p, m_A);
return 0;
}
结果:
我们看到 const修饰的变量m_A被修改了。
虽然不能直接修改,但是我们可以透过指针来修改变量m_A的值。原因是什么呢?
因为在C中我们在定义 const int m_A的时候,内存会分配一段内存用来存储m_A。
而我们的指针绕过编译器,直接跑到这块内存中偷偷修改了里面的值。
所以当我们再回来这块内存取该变量m_A的时候,值已经被修改了。
那么在C++中。
#include <iostream>
using namespace std;
int main(void)
{
const int m_A = 20;
//m_A = 24; //同C一样直接修改是不行的,const修饰的是只读变量
int *p = (int *)&m_A;
*p = 24;
cout << "*p = " << *p << " m_A = " << m_A << endl;
return 0;
}
结果为
我们同样透过指针也没有能够修改掉m_A的值。
因为在C++中const修饰的变量不会再被分配内存,所以我们透过修改内存的方式是不能改变m_A的值的。
C++中const修饰的变量是透过key值来对应的。(key---value, key类似于身份证ID, value类似于这个人)。
所以, C++中的指针操作来修改const变量的时候。内存的具体做法是,
temp = m_A;
int *p = &temp;
所以最后修改的是这个隐藏的temp的值,而不是const修饰的那个变量m_A本身。
总结,const虽然修饰的变量为只读属性。
但是在C中可以称之为伪常量。
在C++中才可以称之为真正的常量。