C语言中类型限定符(qualifier)之一const
2013-05-26 22:07
344 查看
C语言中连个类型限定符:const和volatile。用来对以下的类型说明符进行限定:void
,char ,short ,int ,long ,float ,double ,signed ,unsigned ,结构或联合,说明符,枚举说明符,类型定义名。
“类型限定符可与任何类型说明符一起使用。可以对const 对象进行初始化,但在初始化以后不能进行赋值。”《C程序语言设计(第2版.新版)》P200
看看是否如此?
Test1:访问const修饰的变量
编译错误: error C2166: 左值指定 const 对象
说明:global_t位于代码区,是只读的;而local_t位于栈区的。两者经过const修饰之后都成功转变为“右指”,所以报error C2166错误。
Test2:通过指针访问const修饰的变量
说明:在栈区经过const修饰过的变量的“只读”属性不彻底,可以通过指针来对其修改(再一次体现了指针的威力);但在代码区经过const修饰过的变量时真的“只读”,即使你通过指针也是改不了的,因此在C++里面建议使用const来代替define的一些简单数值宏定义,因为const有编译器来对操作进行检查,多了一层保障。
Test 3:定义指向const修饰的变量为const
Test4:改变经过const修饰的指针的值
送一个:
编译通过,运行错误。
说明:这个实验说明指针也不是威力无穷的,有一些“禁忌区域”是指针也不无法触碰的,比如0这个地址。原因:我们现在时用户应用程序,权限有限,在嵌入式编程中,程序员可以掌控从硬件上电之后的每一句代码;但是指针也还是无敌的,如厂商设定的程序下载引导区域(就是把二进制可执行代码下载到flash中去),厂商会告诉你这些区域的地址,但是你是无法触碰的,也无法通过指针修改,因为他加了一把锁把这片区域锁住了,但是嘿嘿,还是可以解锁的~~~但是你非要去改,程序就死了,即整个板子废掉了,而不是如现在的报错。
答:是的,但是可以迂回的通过指针修改经过const修饰的局部变量,因为它在栈区里面。
,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修饰的局部变量,因为它在栈区里面。
相关文章推荐
- C语言中const、volatile、restrict等类型限定符的区别
- C语言的const类型限定符
- c语言中的类型限定词之一const
- 错误:将'const x'作为'x'的'this'实参时丢弃了类型限定问题解决
- c语言中const 类型变量地址赋值给指针。
- 第二章 变量和基本类型——2.4 const 限定符
- C Primer Plus学习 三十九 类型限定词const
- 将'const xxx'作为'xxx'的'this'实参时丢弃了类型限定
- 小议C和C++中的const类型限定符
- 2 C语言 常量,进制,类型限定 输入输出 运算符 类型转换
- ANSI C的三个类型限定词:const,volatile,restrict
- 类型限定符const
- C关于类型限定符const的2个典型错误!
- 【iOS开发基础教程】C语言 const类型变量
- C语言——类型限定词
- C语言的volatile类型限定符
- C++ 中const 类型限定符不兼容问题
- C语言类型限定修饰符(十八)const、(*)、
- c语言中得const 限定符的用法
- C语言学习9: malloc动态内存存储,动态内存分配去空格字符增长版,动态内存分配去符号incr增长版,型参和返回值都是int型的函数的指针,main函数的地址也可以用指针指向,typedef定义函数指针,函数定义与嵌套的作用,返回函数指针类型,const作用