一、 auto 被它修饰的变量能自动分配内存、释放内存,也就是局部变量和块变量,但由于使用量较多最后决定局部变量、块变量不加就代表加了。像signed关键字一样,但全局变量、静态变量不能用它修饰。
二、typedef 类型重定义,变量被它修饰后,就成为了定义它的数据类型,它可以给较长的数据类型重新取一个简短的名字。 例如:size_t time_t uint8_t uint16_t uint32_t uint64_t int8_t int16_t int32_t int64_t 这些类型都是使用typedef重新定义的。
typedef unsigned long long ll;
typedef int (*FP)(float,float);
三、static 限制作用域、改变存储位置、延长生命周期
1、把全局变量、函数的作用域从全局限制为只能在它所在的.c文件内使用,这样做的优点:防止全局变量、函数与其它全局变量、函数命名冲突,防止其它.c文件中访问到全局变量进行破坏。
2、把局部、块变量的存储位置由stack改为bss或data,这种变量也就静态变量。
3、把延长局部、块变量生命周期改从main函数执行前,到程序执行结束。
四、 const 被它修饰的变量不能显式修改,只是为数据提供了一种保护机制,并不能百分百保证数据不被修改。
五、volatile
默认情况下编译器会优化变量的读值过程:
当第一次使用变量时,CPU中的控制器会从内存中读取变量的值到CPU中(高级缓存)进行运算,之后如果变量的值没有发生显式变化,当再次使用变量时,CPU会使用之前读取的值(高级缓存),而不会从内存中重新读取。
有一些特殊情况,变量的值可能随时改变,而使用volatile就可以让编译不再优化变量的读值过程,每次用到变量时都从内存中读取变量的值。
什么情况下需要使用 volatile 关键字修饰变量:
1、嵌入式、单片机裸机开发时需要volatile关键字。
2、开发驱动程序时需要使用到volatile关键字。
3、多线程共享全局数据时需要使用到volatile关键字。
计算机中的存储介质:
机械硬盘>固态硬盘>内存条>高级缓存>寄存器
六、register 申请把变量的存储介质由内存条改寄存器,可以节约一半的时间。
七、extern 用于声明全局变量,当要其它.c文件中的全局变量时,需要把它在当前.c文件进行声明,声明变量不能赋值。