const在 C 与 C++ 中的区别

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、double等,编译器会将它放到符号表中,不分配内存,当对其取地址时,会分配内存。
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是从符号表中获取的值。

  • 如果用一个变量初始化一个const基础数据类型变量,那么也会给这个const变量分配内存空间,可以通过指针修改其值。
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;
}

运行结果:

  • 自定义数据类型的const变量,例如类对象,也会分配内存,可以通过指针间接修改数据成员的值。
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 条评论)
   
验证码:

相关文章

推荐文章

'); })();