目录
C/C++全局变量
1. c语言中全局const会被存储到只读数据段。而C++中全局const当声明extern或者对变量取地址时,编译器会分配存储地址,变量存储在只读数据段。
const int constA = 10;
int main(){
int* p = (int*)&constA;
*p = 200;
}
2. C中const默认为外部连接,C++中const默认为内部连接。如果想让C++中const具有外部连接,必须显示声明为:extern const int a=10。
C/C++局部变量
C
c中的局部const存储在堆栈区,只是不能通过变量直接修改const只读变量的值,但可以跳过编译器的检查,通过指针间接修改。
C++
指针不可修改(const int a = 10)
如果是基础数据类型,const int a=10此类,编译器会将其放入符号表中,不分配内存。我们对其取地址时会分配临时内存。故通过指针无法修改,例如下代码输出结果 m_A=10。
void test01()
{
const int m_A = 10;
int* p = (int*)&m_A;
*p = 100;
cout << "m_A=" << m_A << endl;
}
指针可修改(变量初始化、自定义数据类型)
1. 变量初始化cosnt
如果用一个变量初始化const变量,如const int a = b,那么也是会给a分配内存。会分配内存的变量就能用指针去修改。
void test02()
{
int a = 10;
const int b = a; //会分配内存,只有是分配内存的变量就能用指针去修改
int *p = (int*)&b;
*p = 1000;
cout << "b=" << b << endl;
}
2. 自定义数据类型
对于自定义数据类型,也会分配内存,分配内存就能通过指针修改
struct Person
{
string m_Name;
int m_Age;
};
void test03()
{
const Person p1;
Person* p = (Person*)&p1;
p->m_Age = 18;
p->m_Name = "德玛西亚";
// (*p).m_Age = 18;
cout << "姓名:" << p1.m_Name << "年龄:" << p1.m_Age << endl;
}
用const替代#define
#define MAX 1024
对于标题语句,我们定义的宏MAX从未被编译器看到过,因为在预处理阶段,所有的MAX已经被替换为102了,于是MAX并没有将其加入到符号表中。此时可能偶会会报出编译错误,错误中提到1024。
建议用const int MAX=1024替代
cosnt和#define区别
1. const有类型,可进行编译器类型安全检查;而#define无类型,不可进行类型检查。
2. cosnt有作用域,而#define不重视作用域,默认定义到文件结尾,需卸载宏常量(#undef MAX),#define作用域从定义到文件结束或者到#undef。如果定义在指定作用域下有效的常量,则#define不能用。