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

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修饰的局部变量,因为它在栈区里面。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值