C语言中-const,volatile

一、const和volatile分析

1、const修饰变量

# 在c语言中const修饰的变量时只读的,其本质还是变量

# const修饰的变量会在内存占用空间

# 本质上const只对编译器有用,在运行时无用

原来const不是真的常量

C语言中-const,volatile

2、const修饰数组

# 在C语言中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] = 5-i;//报错

}

3、const修饰指针

# const int *p; //p可变,p指向的内容不可变

# int const *p; //p可变,p指向的内容不可变

# int *const p; //p不可变,p指向的内容可变

# const int *const p;  //p不可变, p指向的内容不可变

口诀:左数右指

当const出现在*号左边时指针指向的数据为常量,当const出现在*后右边时指针本身为常量

const修饰函数参数和返回值

# const修饰函数参数表示在函数体内不希望改变参数的值

# const修饰函数返回值表示返回值不可改变,多用于返回指针的情形

const int * func()

{

static int count = 0;

count++

return &count;

}

深藏不漏的volatile

1、volatile可理解为“编译器警告指示字”

2、volatile用于告诉编译器必须每次去内存中去取变量值

3、volatile主要修饰可能被多个线程访问的变量

4、volatile也可以修饰可能被未知因数改变的变量


int obj = 10;

int a = 0;

int b = 0;


a = obj;

sleep(100);

b = obj;

以上代码,编译器在编译的时候发现obj没有被当成左值使用,因此会“聪明”的直接将obj替换成10,而把a和b都赋值为10.


课后思考

# const和volatile是否可以同时修饰一个变量?

# const volatile int i = 0; 这个时候i具有什么属性?编译器如果处理这个变量?

答:可以。这个时候i具有const和volatile的双重属性。i变量不可以在编译过程中被程序代码修改,同时编译器不得对i进行优化编译。

C语言中-const,volatile,布布扣,bubuko.com

C语言中-const,volatile

上一篇:linux编程之多线程编程


下一篇:苹果Mac数据库管理开发工具:JetBrains DataGrip