您的位置:首页 > 编程语言 > C语言/C++

C语言中类型限定符(qualifier)之一const

2013-05-26 22:07 344 查看
C语言中连个类型限定符:constvolatile。用来对以下的类型说明符进行限定:void
,char ,short ,int ,long ,float ,double ,signed ,unsigned ,结构或联合,说明符,枚举说明符,类型定义名。

“类型限定符可与任何类型说明符一起使用。可以对const 对象进行初始化,但在初始化以后不能进行赋值。”《C程序语言设计(第2版.新版)》P200

看看是否如此?

Test1:访问const修饰的变量

const double global_t=70;

int main(void)
{
const double local_t=7;

local_t=10;
global_t=10;
return 0;
}


编译错误: error C2166: 左值指定 const 对象

说明:global_t位于代码区,是只读的;而local_t位于栈区的。两者经过const修饰之后都成功转变为“右指”,所以报error C2166错误。

Test2:通过指针访问const修饰的变量

const double global_t=7;
const double *global_t_p=&global_t;

int main(void)
{
const double local_t=7;
const double *local_t_p=&local_t;

*(double *)local_t_p=0;
*(double *)global_t_p=0;//error occurs

return 0;
}
编译通过,运行错误。



说明:在栈区经过const修饰过的变量的“只读”属性不彻底,可以通过指针来对其修改(再一次体现了指针的威力);但在代码区经过const修饰过的变量时真的“只读”,即使你通过指针也是改不了的,因此在C++里面建议使用const来代替define的一些简单数值宏定义,因为const有编译器来对操作进行检查,多了一层保障。

Test 3:定义指向const修饰的变量为const

const double global_t=7;
const double *const global_t_p=&global_t;

int main(void)
{
const double local_t=7;
const double *const local_t_p=&local_t;

*(double *)local_t_p=0;
*(double *)global_t_p=0;

return 0;
}
说明:与Test2一样,因为只改变指针的属性,但是现在只对指针指向的变量操作,故结果无影响。

Test4:改变经过const修饰的指针的值

const double global_t=7;
const double *const global_t_p=&global_t;

int main(void)
{
const double local_t=7;
const double *const local_t_p=&local_t;

global_t_p=local_t_p;
local_t_p=global_t_p;

return 0;
}
说明:与Test1现象一致,编译错误,原因:指针也是变量

送一个:

int main(void)
{
*(int *)0=0;

return 0;
}


编译通过,运行错误。



说明:这个实验说明指针也不是威力无穷的,有一些“禁忌区域”是指针也不无法触碰的,比如0这个地址。原因:我们现在时用户应用程序,权限有限,在嵌入式编程中,程序员可以掌控从硬件上电之后的每一句代码;但是指针也还是无敌的,如厂商设定的程序下载引导区域(就是把二进制可执行代码下载到flash中去),厂商会告诉你这些区域的地址,但是你是无法触碰的,也无法通过指针修改,因为他加了一把锁把这片区域锁住了,但是嘿嘿,还是可以解锁的~~~但是你非要去改,程序就死了,即整个板子废掉了,而不是如现在的报错。

答:是的,但是可以迂回的通过指针修改经过const修饰的局部变量,因为它在栈区里面。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: