1.const修饰符
(1) 阻止变量被改变时使用const修饰符,因此声明变量时要进行初始化,进行唯一一次赋值。当我们使用宏定义定义常量时,只是简单地内容替换,编译器并没有进行类型检查,而使用const时编译器会进行类型检查。
(2)指针常量:如int a = 1;int * const p = &a;指针指向的地址不能更改,但是地址中存储的对象可以更改。
常量指针:如int b = 1; int const *p = &b;(const int *p = &b;)指针指向的地址可以更改,但是地址中存储的对象不能更改。
2.static修饰符
(1)当一个进程的全局变量被声明为static之后,变为静态全局变量。静态全局变量和其他的全局变量的存储地点没有区别,都是在.data段(已初始化)或者.bss段(未初始化)内,但是它只在定义它的源文件内有效,其他源文件无法访问它。
(2)static局部变量叫静态局部变量。它与普通的局部变量的区别:位置:静态局部变量被编译器放在全局存储区.data(注意:不在.bss段内),所以它虽然是局部的,但是在程序的整个生命周期中存在。访问权限:静态局部变量只能被其作用域内的变量或函数访问。虽然它会在程序的整个生命周期中存在,由于它是static的,它不能被其他的函数和源文件访问。值:静态局部变量如果没有被用户初始化,则会被编译器自动赋值为0,以后每次调用静态局部变量的时候都用上次调用后的值。每次函数调用静态局部变量的时候都修改它然后离开,下次读的时候从全局存储区读出的静态局部变量就是上次修改后的值。
3.volatile修饰符
(1)编译器在优化的过程中做了优化处理:编译器发现在对变量赋值之后没有再次改变它的值,所以编译器把它的值备份在了一个寄存器中,在之后的操作中我们再次使用它的值的时候就直接操作这个寄存器,而不去读取它的内存地址,因为读取寄存器的速度要快于直接读取内存的速度。这就使得了读到的它的值为之前的。而不是更新后的。
(2)volatile修饰符的作用就是告诉编译器不要对它所修饰的变量进行任何的优化,每次取值都要直接从内存地址得到。对于我们代码中的那些易变量,我们最好使用volatile修饰,以此来得到每次对其进行更新后的值。
(3)使用场合:中断服务程序中修改的供其它程序检测的变量需要加volatile;多任务环境下各任务间共享的标志应该加volatile。
4.sizeof()运算符
(1)sizeof是C语言的一种单目操作符,如其他操作符++、--等,它不是函数。sizeof操作符以字节形式给出了其操作数的存储大小。操作数可以是一个表达式或数据类型名。操作数的存储大小由操作数的数据类型决定。