05-const.volatile
来源:互联网 发布:火星时代 知乎 编辑:程序博客网 时间:2024/05/24 02:21
const关键字
const修饰一个只读变量
在c语言中const修饰的变量是只读的,其本质还是变量,在内存中占用空间
本质上const只对编译器有用,在运行时无用;在运行时可以通过一个指针改变其值;
用const int cc = 1;定义变量后
做左值时,将报错
做右值时,
1.直接访问 int cb = cc;直接从变量表取出内容替换;
2.间接访问 int *p = (int *)&cc; 在运行时到内存取值后赋值;
在c语言中const修饰的数组是只读的
const修饰的数组空间不可被改变(对现在的c编译器而言)
const int arr[5] = {1, 2, 3, 4, 5};
int *p = (int*)arr;
int i = 0;
for (i = 0; i < 5; i++) {
p[i] = 5 - i; //oops!
}
const修饰指针
int const * p; //p可变,p指向的普通变量的内容不可变
const int * p; //p可变,p指向的普通变量的内容不可变,与int const *p等价;
int * const p; //p指针不可变,p指向的普通变量的内容可变
int const * const p; //p和p指向的普通变量的内容都不可变
const int * const p: //p和p指向的普通变量的内容都不可变,等价于上句;
const * int p; //不合法
const实际上是修饰其左边的东西,const与类型标示符可以更换位置但不能越过*号
口诀
const相对于*号,(const在*的)左数(在*的右)右指为只读;
当const出现在*号左侧时,指针指向的数据为只读
当const出现在*号右侧时,指针本身为只读
const修饰函数参数和返回值
const修饰的函数参数表示在函数体内不希望被改变参数
const修饰的函数返回值表示返回值不可改变(不能做左值),多用于改变指针的情形;
const int * func() {
static int count = 0;
count++;
return &count;
}
int const *p = func();
#include <stdio.h>
int main(){
const int cc = 1;
int *p = (int *)&cc;
printf("%d\n", cc);
/* cc = 3; //编译器报错 */
*p = 3; //可以间接改变cc的值
printf("%d\n", cc);
return 0;
}
volatile关键字
volatile可理解为"编译器警告指示字"
volatile用于告诉编译器每次必须去内存中取变量的值,不要做优化
volatile主要修饰可能被多个线程访问的变量
volatile也可修饰可能被未确定因素更改的变量
int obj = 10;
int a = 0;
int b = 0;
a = obj;
sleep(100);
b = obj;
编译器在编译的时候发现obj没有被当成左值使用,因此会"聪明"的直接将obj替换成10,而把a和b都赋值成10;
volatile int obj = 10;//编译器将每次都直接访问obj的存储位置
const和volatile是否可以同时修饰一个变量?
可以
const volatile int i = 0;这个时候i具有什么属性,编译器如何处理这个变量?
const告诉我们不应该通过程序来试图修改i的值;
volatile告诉编译器i的值随时可能会发生改变,每次引用该变量时都要从内存中读取,以获取最新的结果
const修饰一个只读变量
在c语言中const修饰的变量是只读的,其本质还是变量,在内存中占用空间
本质上const只对编译器有用,在运行时无用;在运行时可以通过一个指针改变其值;
用const int cc = 1;定义变量后
做左值时,将报错
做右值时,
1.直接访问 int cb = cc;直接从变量表取出内容替换;
2.间接访问 int *p = (int *)&cc; 在运行时到内存取值后赋值;
在c语言中const修饰的数组是只读的
const修饰的数组空间不可被改变(对现在的c编译器而言)
const int arr[5] = {1, 2, 3, 4, 5};
int *p = (int*)arr;
int i = 0;
for (i = 0; i < 5; i++) {
p[i] = 5 - i; //oops!
}
const修饰指针
int const * p; //p可变,p指向的普通变量的内容不可变
const int * p; //p可变,p指向的普通变量的内容不可变,与int const *p等价;
int * const p; //p指针不可变,p指向的普通变量的内容可变
int const * const p; //p和p指向的普通变量的内容都不可变
const int * const p: //p和p指向的普通变量的内容都不可变,等价于上句;
const * int p; //不合法
const实际上是修饰其左边的东西,const与类型标示符可以更换位置但不能越过*号
口诀
const相对于*号,(const在*的)左数(在*的右)右指为只读;
当const出现在*号左侧时,指针指向的数据为只读
当const出现在*号右侧时,指针本身为只读
const修饰函数参数和返回值
const修饰的函数参数表示在函数体内不希望被改变参数
const修饰的函数返回值表示返回值不可改变(不能做左值),多用于改变指针的情形;
const int * func() {
static int count = 0;
count++;
return &count;
}
int const *p = func();
#include <stdio.h>
int main(){
const int cc = 1;
int *p = (int *)&cc;
printf("%d\n", cc);
/* cc = 3; //编译器报错 */
*p = 3; //可以间接改变cc的值
printf("%d\n", cc);
return 0;
}
volatile关键字
volatile可理解为"编译器警告指示字"
volatile用于告诉编译器每次必须去内存中取变量的值,不要做优化
volatile主要修饰可能被多个线程访问的变量
volatile也可修饰可能被未确定因素更改的变量
int obj = 10;
int a = 0;
int b = 0;
a = obj;
sleep(100);
b = obj;
编译器在编译的时候发现obj没有被当成左值使用,因此会"聪明"的直接将obj替换成10,而把a和b都赋值成10;
volatile int obj = 10;//编译器将每次都直接访问obj的存储位置
const和volatile是否可以同时修饰一个变量?
可以
const volatile int i = 0;这个时候i具有什么属性,编译器如何处理这个变量?
const告诉我们不应该通过程序来试图修改i的值;
volatile告诉编译器i的值随时可能会发生改变,每次引用该变量时都要从内存中读取,以获取最新的结果
0 0
- 05-const.volatile
- const volatile
- const & volatile
- const volatile
- const & volatile
- const & volatile
- const和const volatile关键字
- 谈谈volatile和const
- Const and volatile
- const,static,extern,volatile
- const volatile的使用
- 关键字static,const,volatile
- const ,mutable,volatile()
- volatile and const 用法
- const,volatile,enum,static
- Const and volatile
- const volatile 关键字
- const与volatile
- Windows下编译CAFFE,status == CUDNN_STATUS_SUCCESS,关闭CUDNN
- jar包Proguard混淆方法
- Fragment在不同情况下的生命周期
- MyEclipse Servers视窗出现“Could not create the view: An unexpected exception was thrown”错误解决办法
- 我眼中的下拉刷新
- 05-const.volatile
- Linux电源管理_Generic PowerManager 之Suspend功能--(一)
- android源代码
- OpenRPG横版格斗RPG(Demo)
- js splice 用法小结
- MySQL数据库插入速度调整
- 一般cache的做法
- 06-struct.union
- Android开发资源文件用法小结