auto
自动存储
在C语言中变量默认是auto变量,表示系统自动为变量分配内存。
register
寄存器存储
有可能会因为寄存器不足而申请失败。特点为效率高,速度快。
#include <stdio.h>
int main(int argc, char *argv[])
{
int a = 0;
// register int a = 0;
while( a != 1000000000) // while循环
a++;
return 0;
}
static
静态存储
被声明为静态存储类型的变量时,无论是全局的还是局部的,该变量都存储在静态区中,其生命周期为整个程序。
如果是静态局部变量,其作用域为一对 { } 内;如果是静态全局变量,其作用域为当前文件。
静态变量如果没有被初始化,则自动初始化为零。静态变量只能初始化一次。
一、static修饰局部变量,延长生命周期,将该局部变量存储于静态区,会在程序结束后释放。其作用域为一对 { } 内。
#include <stdio.h>
int main(int argc, char *argv[])
{
int a = 0;
while (a != 3)
{
int num = 20;
num = num + 20;
a++;
printf("num:%d\n", num);
}
return 0;
}
// 结果为
// num:40
// num:40
// num:40
#include <stdio.h>
int main(int argc, char *argv[])
{
int a = 0;
while (a != 3)
{
static int num = 20;
num = num + 20;
a++;
printf("num:%d\n", num);
}
return 0;
}
// 结果为
// num:40
// num:60
// num:80
二、static修饰全局变量,限制作用域,该全局变量只能在本文件中使用。全局变量原本就存储在静态区(全局变量区)中,在程序结束后释放。
demo_extern.c:
#include <stdio.h>
extern int a;
int main(int argc, char *argv[])
{
printf("a:%d\n", a);
return 0;
}
1.c:
#include <stdio.h>
static int a = 20;
gcc demo_extern.c 1.c
编译会报错,找不到外部对a的定义,因为static限制了全局变量只能在本文件中使用
三、static修饰函数,限制作用域,该函数只能在本文件中使用。
extern
外部调用存储
如果一个文件调用另一个文件中的变量,则在调用文件中需要使用extern关键字声明该变量。
demo_extern.c:
#include <stdio.h>
extern int a;
int main(int argc, char *argv[])
{
printf("a:%d\n", a);
return 0;
}
1.c:
#include <stdio.h>
int a = 20;
gcc demo_extern.c 1.c
./a.out
运行结果为:
a:20
const
将变量常量化,被const修饰的变量,其内容不可修改,变成了read-only。
#include <stdio.h>
int main(int argc, char *argv[])
{
const int a = 10;
a = 20;
return 0;
}
编译时报错:
demo_const.c: In function ‘main’:
demo_const.c:12:7: error: assignment of read-only variable ‘a’
12 | a = 20;
| ^
volatile
防止代码被优化,从内存当中直接读取数据而非缓冲区。