const volatile int i = 10:
const表示变量i只有读权限,没有写权限,就是不能更改,但是不代表变量i的值一直不变。
volatile表示变量i里面的值可能会被意想不到的改变。
当创建一个进程时,会分配4G的虚拟内存,其中包括:代码段、全局区、堆区、栈区;只有代码段是不可改的,强改会发生内存错误。而全局区、堆区、栈区都是可以改得。
比如const volatile int i = 10;如果在函数里定义,则会把i的内存分配到栈区;如果在函数外定义,则会分配到全局区;我们可以找到i的内存,然后改它的值。
比如:int *p = (int*)&i; *p = 100;
则i的值会变成100.
(顺便说下,如char *p = "aaaa";其中"aaaa"会保存在代码段中,p中存的是第一个a的地址,当我们通过p去改变其值时,如:p[1] = 'b';就会发生内存错误)
但是,如果没有加volatile修饰,在我们编译时,编译器会认为const int i;是常数,因此不会被更改,为了提高访问效率,就可能会把i的值保存起来,而不会到i的地址上去取数据。而加了volatile,编译器则不会做这个优化,每次需要i的值时,都会到i的地址上去取数据。
在处理底层数据时(比如驱动方面),会用到很多...