1.auto:
自动类型的变量(非自动类型的变量:全局变量,或者static修饰的变量)自动类型的变量前默认缺省auto,在实际的工作开发过程中是见不到的。
2.register:修饰的是寄存器变量
1.register修饰的变量要比普通的变量运算效率高(但不能把所有的变量都定义成register修 的, 因为寄存器在芯片内部是有个数限制的)
2.register修饰的变量不能够取地址
3.static
3.1static的作用:
1.static局部变量在函数内定义,它的生存期为整个源程序,但是其作用域仍与自动变量相同,只能在定义该变量的函数内使用该变量。退出该函数后,尽管该变量还继续存在,但不能使用它。再次调用该函数可以再次使用。
2.static修饰全局变量的时候,这个全局变量只能在本文件中访问,不能在其它文件中访问,即便是extern外部声明也不可以。
3.static修饰一个函数,则这个函数的只能在本文件中调用,不能被其他文件调用。Static修饰的局部变量存放在全局数据区的静态变量区。初始化的时候自动初始化为0;
(1)不想被释放的时候,可以使用static修饰。比如修饰函数中存放在栈空间的数组。如果不想让这个数组在函数调用结束释放可以使用static修饰
(2)考虑到数据安全性(当程想要使用全局变量的时候应该先考虑使用static)
3.2static全局变量与普通的全局变量有什么区别?static局部变量和普通局部变量有什么区别?static函数与普通函数有什么区别?
1)static修饰的全局变量和去普通的全局变量一样都分配在静态区,但是普通的全局变量,它作用于整个源代码,当如果出现同名的全局变量时,只能有一个初始化,不然就会连接失败,而static修饰的全局变量,只作用于本文件中,在其它文件中不起作用,因此可以避免在其它源文件中引起错误。
2)static局部变量只初始化一次,下一次的值依据上一次的结果值,从而延长了生命周期,而局部变量如果程序结束再次开始时候,又将被重新定义。
3)static函数在内存中只有一份,普通函数爱每个被调用中维持一份拷贝。
4.extern:修饰调用的变量或者函数是在其他文件中的
extern int num; //extern修饰的num变量不能赋初值,只起到声明的作用
//如果修饰的变量是其他文件中的,变量前一定要加extern
extern int add(int ,int );//声明函数的时候可以加也可以不加
5.const:在谁前谁就不能被修改
const:修饰的是只读的变量(const修饰的不是常量)
const int a=10; //a的值不能够修改了
const int *p = &a; //p可以修改,*p不能修改
int const *p = &a;//p可以修改,*p不能修改
int *const p = &a//p不可以修改,*p可以修改 //const在谁前谁就不能更改
注:const修饰的局部变量在栈空间,const修饰的全局变量在.ro段
1.欲阻止一个变量被改变,可使用const,在定义该const变量时,需先初始化,以后就没有机会改变他了;
2.对指针而言,可以指定指针本身为const,也可以指定指针所指的数据为const,或 二者同时指定为const;
3.在一个函数声明中,const可以修饰形参表明他是一个输入参数,在函数内部不可以改变其值;
4.对于类的成员函数,有时候必须指定其为const类型,表明其是一个常函数,不能修改类的变量;
5.对于类的成员函数,有时候必须指定其返回值为const类型,以使得其返回值不为“左值”。
6.volatile
volatile:易变的
如果使用volatile修饰变量,变量每次都会从内存中获取值,不从缓存中获取值。
使用的场景:
1.对应硬件寄存器前最好加上volatile
请向0xaabbccdd地址中写0x12345678的值?
#define P (volatile unsigned int *)0xaabbccdd
*P = 0x12345678;
2.在多线程中访问全局,这个全局变量就需要加volatile
3.在中断中访问非自动类型的变量