1、C语言中全局const变量会存储到只读数据段,C++中全局const变量声明为extern或者对变量取地址时,编译器会分配内存,变量存储在只读数据段。两个都受到了只读数据段的保护,不可修改。
const int constA = 100;
int main()
{
int* p = (int*)&(constA);
*p = 200;
return 0;
}
运行结果:
以上代码在C/C++中均编译通过,但是在运行期修改constA的值时,发生写入错误,原因是修改只读数据段的数据。
2、C语言中局部const存储在堆栈区,只是不能通过变量直接修改const只读变量的值,但是可以跳过编译器的检查,通过指针间接修改const的值。
int main()
{
const int constA = 100;
int* p = (int*)&(constA);
printf("constA = %d\n", constA);
*p = 200;
printf("*p = %d\n", *p);
return 0;
}
运行结果:
3、C++中的局部const变量:
int main()
{
const int constA = 100;
int* p = (int*)&(constA);
*p = 200;
cout << "constA = " << constA << endl;
cout << "*p = " << *p << endl;
return 0;
}
运行结果:
constA在符号表中,当对constA取地址,这个时候为constA分配了新的空间,* p操作的是分配的空间,而constA是从符号表中获取的值。
int main()
{
int b = 100;
const int constA = b;
int* p = (int*)&(constA);
*p = 200;
cout << "constA = " << constA << endl;
cout << "*p = " << *p << endl;
return 0;
}
运行结果:
class Person
{
public:
int age;
string name;
};
int main()
{
const Person person; //未初始化age
// person.age = 20; // 无法修改
Person* pPerson = (Person*)&person;
pPerson->age = 100; // 指针间接修改
cout << "pPerson->age:" << pPerson->age << endl;
return 0;
}
运行结果:
const由C++采用,并加进标准C中。在C语言中const默认为外部连接,C++中const默认为内部连接。当C语言中两个文件中有同名const变量时,编译器会报重复定义,在C++中就不会。若想让C++中的const成为外部连接,必须用extern显式声明。
留言与评论(共有 0 条评论) |