每当我们将const限定符与变量名一起使用时,它就会变为只读变量并存储在.rodata段中。任何试图修改该只读变量的尝试都将导致编译错误:“分配只读变量”。
在下面的程序中,尝试使用const限定符声明的只读变量进行修改:
#include
int main()
{
const int var = 10;
var = 15;
printf("var = %d\n", var);
return 0;
}
输出:
prog.c: In function 'main':
prog.c:5:9: error: assignment of read-only variable 'var'
通过指针更改const变量的值
使用const关键字声明的变量将存储在.rodata段中,但是我们仍然可以通过指针访问变量并更改该变量的值。通过将变量的地址分配给非常数指针,我们将常数变量转换为非常数指针。编译器将在类型转换时发出警告,并会丢弃const限定符。变量和指针的编译器优化是不同的。这就是为什么我们能够通过非常量指针更改常量变量的值的原因。
下面的程序说明了这一点:
//Write C code here
#include
#include
int main()
{
const int var = 10;
int *ptr = &var;
*ptr = 12;
printf("var = %d\n", var);
return 0;
}
输出:
prog.c: In function 'main':
prog.c:6:16: warning: initialization discards 'const' qualifier
from pointer target type [-Wdiscarded-qualifiers]
int *ptr = &var;
var = 12
注意:如果我们尝试通过常量指针更改值,则会因为尝试更改只读段而收到错误消息。
想要从精选的最佳视频中学习和练习问题,请查看《基础知识到高级C的C基础课程》。