转载前注明出处,欢迎转载分享
const详解:const可以修饰变量,数组,指针,还可以修饰函数。
const修饰变量:
const修饰的变量为只读变量,不能给只读变量直接赋值(即const修饰的变量不能出现在等号左边),但是可以通过指针访问这一块内存区域然后间接修改该值。
const修饰数组:
C中const修饰的数组是只读的,const修饰的数组空间不可被改变(即数组内存放的值),但是又正如const常量一样,可以通过指针访问该内存区域进行间接修改。
代码如下:
1
2 3 4 5 6 7 8 9 |
#include int { } |
const修饰指针:
1)例如这种:const int* p; int const*p;当const在*左侧时,const修饰的指针可以更改指针指向,不能通过指针修改指向的内存空间所存放的值。
代码如下:
1
2 3 4 5 |
int int const //*p p |
1)例如这种:int* constp;当const在*右侧时,const修饰的指针指向的地址不可改变,但是指针指向的地址存放的内容可以进行修改。
代码如下:
1
2 3 4 5 |
int int int //p *p |
记忆口诀:左数右指(const在*左,数值为常量。const在*右,(指针)指向为常量)
const修饰函数:
1)const修饰函数参数表示在函数体内不希望改变参数的值
2)const修饰函数返回值表示返回值不可改变,多用于返回指针的情形
--------------------------------------------------------------------------------------------------------
volatile详解:
volatile可理解为“编译器警告指示字”
volatile用于告诉编译器必须每次去内存中取变量值
volatile主要修饰可能被多个线程访问的变量
volatile也可以修饰可能被未知因数更改的变量
看如下代码:
1
2 3 4 5 6 7 8 9 10 |
int int int a sleep(100); b |
编译器在编译的时候发现obj没有被当做左值使用,因此会“聪明”的优化,将obj替换成10,所以就把a和b都赋值为10。
在上述程序中,在sleep的100s内如果发生了
硬件中断(在这里我将其简单理解为外部突发的异常使得程序变量值发生突然改变,这种改变也可能在程序执行时),可能obj的值突然变为了100,然而因为编译器的优化,b=obj;可以被编译器优化看成b=10;那么当我们想要通过b获取obj在硬件中断后发生改变而产生的值时,却无法观察的到,所以可以将obj定义为volatile类型,及告诉编译器不要做任何的优化,每次都老老实实的去内存中取出该变量的值。(在多线程中也会用到该关键字volatile)
const和volatile可以同时修饰一个变量。
1
2 |
volatile const |
只读的状态寄存器,它是volatile,因为它可能被意想不到地改变,同时它又是const,因为程序不应该试图去修改它。volatile和const并不矛盾,只是控制的范围不一样,一个在程序本身之外,另一个是程序本身。