1、局部变量和全局变量
局部变量:凡是在{}以内的变量称为局部变量,也包括形式参数。
全局变量:凡是在{}以外的变量称为全局变量。
2、作用域的概念
局部作用域:{}以内的作用域称为局部作用域,主要包含的是变量
全局作用域:{}以外的作用域称为全局作用域,一类是变量,一类是函数
同一作用域内,不可以用重名的标识符。
局部变量的作用域,起始于定义处,直到所在的大括号结束。
全局变量的作用域,起始于定义处,直到本文件的结束。
3、作用域叠加
作用域叠加:指的是,全局变量同局部变量的作用域叠加,
在不同的作用域,可以有重名的标识符,局部变量会覆盖全局变量的作用域。
更小的作用域,只能用于再次划分局部作用域。
4、全局命名污染
5、生命周期
函数的生命周期,起于调用,结束于调用结束
局部变量的生命周期,起于调用,结束于调用结束
main开始 == 进程的开始, main函数的结束 == 进程的结束
全局变量的生命周期,起始于main函数的调用,结束于main函数的调用结束,等价于进程的生命周期
6、auto (大将军)
auto只能用于修饰局部变量,表示该变量存储于栈stack上。
存储于栈上的数据特点:随用随开,用完即消。
默认的局部变量,就是auto类型的,所以通常将其省略。
在C中将其忘记即可,C++ 中再讨论别的作用
7、register (小太监)
register只能修饰局部变量。存储于cpu的一个变量,速度很快,但数量有限,所以通常被优化。
使用场景:频繁使用的变量,避免cpu和内存之间频繁交互。
一般不用,将其忘记
8、extern (通关文牒)
extern只能用来修饰全局变量。
全局变量本身是全局可用的 ,但是由于文件是单个完成编译 ,并且编译是 自上而下 的,所以说,对于不是在本范围内定义的全局变量,要想使用必须用 extern 进行声明,如果不加上 extern ,就会造成重定义。
注意:经extern 声明的变量,不可以再初始化。
C语言,是单文件编译的,然后再将编译的 .o文件同库一起链接成可执行文件。正是因为这一点,跨文件使用全局变量,需要声明。
//main.c
#include <stdio.h>
extern int a;
int main()
{
printf("a = %d\n, a");
return 0;
}
//other.c
int a = 5;
extern是可以省略的,但是不建议省略。
9、声明与定义
变量的声明与定义,现在要区分了。
定义的时候可赋值可不赋值(即可先定义后初始化),但声明时不可赋值。
10、static(限离出境)
1、修饰局部变量
static 修饰,局部变量,修改了局部变量的生命周期。使其生命周期同进程或是 main()函数。
static变量若未初始化,则系统初始化为零,并且只进行一次初始化。
静态局部变量的应用:
①用于流程控制
②用于统计函数 (功能的 )调用次数案例,或是加载资源文件。
2、修饰全局变量
static 修饰,全局变量,限制了他的外延性。使其成为仅在本文件内部使用的全局变量。
全局变量会带来全局空间的命名污染 。 这样既保留了全局变量的使用便利性,又不会造成全局空间的命名污染。
3、修饰函数
static 修饰函数的意义,就在于将全局函数变成了,本文件内的全局函数。
小结:
变量分类 | 生命周期 | 作用域 | 默认值 | 修饰符 | 生命周期 | 作用域 | 默认值 |
局部变量 | 起于调用,结束于调用结束 | 起始于定义处,直到所在的大括号结束。 | 随机 | auto | 起于调用,结束于调用结束 | 起始于定义处,直到所在的大括号结束。 | 随机 |
register | |||||||
static | 起始于main函数的调用,结束于main函数的调用结束 | 起始于定义处,直到所在的大括号结束。 | 0 | ||||
全局变量 | 起始于main函数的调用,结束于main函数的调用结束,等价于进程的生命周期 | 起始于定义处,直到本文件的结束。 | 0 | 起始于main函数的调用,结束于main函数的调用结束,等价于进程的生命周期 | 限制了外延性,仅在本文件内部使用的全局变量。 | 0 | |
extern | 可以跨文件(说法不准确),详见上面extern用法 | 0 |
参考资料:《零基础入门C语言--王桂林》