auto:(自动类型)
在定义变量的时候,变量前默认就是auto
auto int a; 等于 int a
非自动类型的变量:
1.全局变量
2.static修饰的变量
register:寄存器类型的变量
register int a;
寄存器类型的变量,要不普通的变量执行效率要高。
在一个soc(system on chip)上寄存器的个数是有限
在(A53:40)
static:
static 修饰的变量如果没有初始化默认为0;
static int a;
printf("a = %d\n",a); //结果是0
作用:1.延长变量的生命周期
void static_fun()
{
static int a = 1;
a ++;
printf("a = %d\n",a);
}
static_fun(); //2
static_fun(); //3
2.限制作用域
static修饰的函数或者变量只能在本文件
中使用。
const:(只读变量)
const int a=10;
a = 100; //错误
int a = 10;
int b = 1000;
const int *p = &a;
*p = 100; 错误的
p = &b; 正确的
表示p执行的内容不能修改,但是p是可以修改的。
int a = 10;
int b = 1000;
int const *p = &a;
*p = 100; 错误的
p = &b; 正确的
表示p执行的内容不能修改,但是p是可以修改的。
int a = 10;
int b = 1000;
int * const p = &a;
*p = 100; 正确的
p = &b; 错误的
*p可以修改,p不允许修改
const int * const p = &a;
代表*p和p都是只读的。
extern:
extern int a;
extern int add(int a,int b);
a或add函数定义没有在当前的.c中,它是
在另外一个.c中定义的。
volatile:(容易改变的)
volatile int *p =
(volatile int *)0x8000000; (地址中保存的是10)
*p 取出地址中的值10;
//(硬件将0x8000000地址中的值改为了100);
//由于地址中的数据不是别这个程序修改的,
//所以下面这个式子在运算的时候,还是拿的之前的
//数据
y = *p + 1; //不加volatile是11
//如果加volatile就是101
总结:防止编译器对变量优化,每次在使用这个变量
的值的时候,都需要重新从内存上取值。