专题一关键字的剖析----5.const,volatile分析
来源:互联网 发布:csgo弹道优化参数 编辑:程序博客网 时间:2024/05/29 14:30
const
在C语言中Const修饰的变量是只读的,不能作为左值被修改,但是它不是真的常量,还是占据内存空间,其本质还是变量(通过指针还是可以修改)。
const int cc=1;int* p=(int*)&cc;printf(“%d\n”,cc);*p=3;printf(“%d\n”,cc);
剖析:
在编译原理的符号表中为:cc int 1
当cc作为左值时:编译器报错
当cc作为右值时:int cb=cc;(直接访问)编译器直接从符号表中取值替换;
int* p=(int*)&cc;
(取地址)直接从内存找到cc现在的值(立即刷新内存)然后再替换。
const修饰数组时表示数组是只读的,const修饰的数组空间是不可改变的(但是通过指针还是可以改变,但是某些编译器中程序会直接死掉)。
const int A[5]={1,2,3,4,5};int* p=(int*)A;int i=0;for(i=0;i<5;I++){ p[i]=0; //opps!}
Const修饰指针时,阅读技巧:左数右指
const int* p(int const* p);
int* const p;
const int* const p;
Const在*号左边:指针指向的数据为常量,不可改变
Const在*号右边:指针本身为常量,不可更改指向。
Const修饰函数参数:表示在函数体中不能改变参数的值
Const修饰函数的返回值:表示返回值不可改变;多用于返回指针的时候,进行类型检查。
Volatile
Volatile用于要求编译器每次必须去内存中取变量的值(防止过度或者说不合适的优化)(多线程,中断等)。
主要用在被多个线程访问的变量,或者可能被未知因素更改的变量。
int obj=10;int a=0;int b=0;a=obj;sleep(1000);b=obj;//编译器优化:编译器发现obj从来没有被修改,聪明地直接将obj替换为10,不再从内存中取值;对于多线程,中断,等待响应等情况出现问题。
思考:
const和volatile是否可以同时修饰一个变量?那const volatile int i=0:这个变量具有什么特性?
阅读全文
0 0
- 专题一关键字的剖析----5.const,volatile分析
- 专题一关键字的剖析----6.struct,union的分析
- 专题一关键字的剖析----7.enum,typedef的分析
- 专题一关键字的剖析----1.基本数据类型分析
- 专题一关键字的剖析----2.aoto,register,static分析
- const , volatile 关键字分析
- 【C语言复习(一)】auto、static、register、const、volatile关键字的分析
- 专题一关键字的剖析----4.goto,void,extern,sizeof的分析
- 专题一关键字的剖析----3.if,switch,do,while,for分析
- C语言中关键字const、static、volatile的用法分析
- 嵌入式开发中关键字const、static、volatile的用法分析
- volatile关键字的分析
- 转:关键字Const和Volatile的使用
- 关键字Const与Volatile的使用
- 关键字static、const、volatile的作用
- 关键字Const与Volatile的使用
- .const与volatile关键字的用法
- const volatile static register关键字的作用
- RabbitMQ的元数据重建
- 581. Shortest Unsorted Continuous Subarray
- Leetcode练习<十四> 求最大子序列的和
- makefile 实验
- HTML系列之外联式(六)
- 专题一关键字的剖析----5.const,volatile分析
- codevs1250 Fibonacci数列
- 随机背景颜色的生成
- Coderforces String Task
- android binder机制---servicemanager进程启动
- JPS数据交互
- HTML系列之内联式(七)
- bzoj 1196: [HNOI2006]公路修建问题 (最小生成树)
- 面向对象之抽象abstract