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的值随时可能会发生改变,每次引用该变量时都要从内存中读取,以获取最新的结果

0 0
原创粉丝点击