- C语言中定义变量的格式:
存储类型 数据类型 变量名;
- C语言的存储类型:
- 常见的有
const、static、extern、auto、register、volatile
; - const关键字:
- const关键字修饰变量时,该变量表示是一个
只读变量
,不能通过变量名修改变量的值
; - 案例:
const int m = 20;int const n = 30;m = 30;//不可以赋值,因为m是只读变量n = 20;//不可以赋值,因为n是只读变量
- const修饰指针:
- 三种情况:
- 1、指针的
指向可以修改
,但是不能通过指针修改指向空间里面的内容
; - 案例:
const int *p;int const *p;
- 2、指针的
指向不可以修改
,但是能通过指针修改指向空间里面的内容
; - 案例:
int * const p;
- 3、指针的
指向不可以修改
,也不能通过指针修改指向空间里面的内容
; - 案例:
const int * const p;
-
static关键字:
-
static常用于修饰变量;
-
static的作用:
-
一、延长局部变量的生命周期:
-
static修饰
的静态局部变量
只执行初始化1次
,使得局部变量的生命周期
原本从离的最近的花括号结束,在static修饰后,延长至整个程序结束
; -
二、限制作用域:
-
1、static修饰的
全局变量
,只能在本源文件
中访问,即便是extern外部声明
也不可以
; -
2、static修饰的
函数
,只能在本源文件
中调用; -
static 修饰的变量:
-
其存放在
全局数据区
的静态变量区
,包括全局静态变量
和局部静态变量
,都在全局数据区
分配内存,其在初始化时,自动初始化为 0
; -
特别注意:
-
1、static修饰的
局部变量
在主函数执行之前
,就已经分配好了; -
2、在功能函数中,static修饰的局部变量
只是一个声明
,多次调用时,也不会重新赋值
; -
3、static修饰的局部变量仍是局部变量,
作用域还是离的最近的花括号
; -
extern关键字:
-
extern修饰的
变量或者函数
是在其他源文件中定义的,即在一个源文件中,若要使用其他源文件中所定义的变量或者函数,需要使用extern关键字声明
; -
auto关键字:
-
除了
全局变量
和static的变量
,定义变量时,省略存储类型的变量,默认都是auto修饰
的; -
register关键字:
-
register修饰
的是寄存器类型
的变量,被处理器执行的效率是最高的
; -
CPU在取数据时,优先级为:寄存器 > 高速缓存(
cache
)> 内存空间; -
由于中央处理器的寄存器的
个数是有限
的,所以把所有的变量都定义成寄存器变量是不现实
的; -
特别注意:
-
register关键字修饰的变量是
不能取地址
的; -
volatile关键字:
-
主要作用是,防止编译器优化,要求CPU每次取数据,必须在内存中取;
-
常见的使用场景:
-
1、多线程访问同一个变量;
-
2、寄存器处于中断的状态;