C语言 作用域
类型 |
作用域 |
生命周期 |
auto变量 |
一对{}内 |
当前函数 |
static局部变量 |
一对{}内 |
整个程序运行期 |
extern变量 |
整个程序 |
整个程序运行期 |
static全局变量 |
当前文件 |
整个程序运行期 |
extern函数 |
整个程序 |
整个程序运行期 |
static函数 |
当前文件 |
整个程序运行期 |
register变量 |
一对{}内 |
当前函数 |
局部变量与全局变量
一、变量作用域
C语言变量的作用域分为:
- 代码块作用域(代码块是{}之间的一段代码)
- 函数作用域
- 文件作用域
二、局部变量
1、说明
局部变量也叫auto自动变量(auto可写可不写),一般情况下代码块{}内部定义的变量都是自动变量,它有如下特点:
- 在一个函数内定义,只在函数范围内有效
- 在复合语句中定义,只在复合语句中有效
- 随着函数调用的结束或复合语句的结束局部变量的声明声明周期也结束
- 如果没有赋初值,内容为随机
2、案例

#include <stdio.h> void test() { //auto写不写是一样的 //auto只能出现在{}内部 auto int b = 10; } int main(void) { //b = 100; //err, 在main作用域中没有b if (1) { //在复合语句中定义,只在复合语句中有效 int a = 10; printf("a = %d\n", a); } //a = 10; //err离开if()的复合语句,a已经不存在 return 0; }

#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h> #include <time.h> void fun01(int a) { return 0; } int main(void) { // 局部变量 // 定义变量:局部变量 在函数内部定义的变量 使用auto修饰、栈区存储 // 作用域:在函数内部 // 生命周期:从创建到函数结束 // 局部变量未初始化,值为乱码 auto int a = 10; printf("%d\n", a); // 局部变量I,只限于for循环使用 for (int i = 0; i < 10; i++) { break; } return 0; }
三、全局变量
1、说明
- 在函数外定义,可被本文件及其它文件中的函数所共用,若其它文件中的函数调用此变量,须用extern声明
- 全局变量的生命周期和程序运行周期一样
- 不同文件的全局变量不可重名
2、案例

#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h> #include <time.h> // 全局变量 // 全局变量、在函数外部定义的变量、存储数据区、可以和局部变量重名 // 作用域:整个项目中所有文件、如果在其他文件中使用 需要声明 extern // 生命周期:从程序创建到程序销毁 // 全局变量未初始化、值为0 extern int a = 10; int main(void) { printf("%d\n", a); int a = 123; // 匿名内部函数、执行完销毁 { int a = 123456; printf("%d\n", a); } // 数据在操作时会采用就近原则 printf("%d\n", a); return 0; }
四、静态(static)局部变量
1、说明
- static局部变量的作用域也是在定义的函数内有效
- static局部变量的生命周期和程序运行周期一样,同时staitc局部变量的值只初始化一次,但可以赋值多次
- static局部变量若未赋以初值,则由系统自动赋值:数值型变量自动赋初值0,字符型变量赋空字符
2、案例

#include <stdio.h> void fun1() { int i = 0; i++; printf("i = %d\n", i); } void fun2() { //静态局部变量,没有赋值,系统赋值为0,而且只会初始化一次 static int a; a++; printf("a = %d\n", a); } int main(void) { fun1(); fun1(); fun2(); fun2(); return 0; }

#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h> #include <time.h> void fun04() { // 静态局部变量 // 静态局部变量只会初始化一次,可以多次赋值 // 正常局部变量函数执行完后会被销毁 // 在数据区进行存储 // 作用域:只能在函数中使用 // 生命周期:从程序创建到程序销毁 // 静态局部变量未初始化、值为0 static int b = 10; b++; printf("%d\n", b); } int main(void) { for (int i = 0; i < 10; i++) { fun04(); } return 0; }
五、静态(static)全局变量
1、说明
- 在函数外定义,作用范围被限制在所定义的文件中
- 不同文件静态全局变量可以重名,但作用域不冲突
- static全局变量的生命周期和程序运行周期一样,同时staitc全局变量的值只初始化一次
2、案例

#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h> #include <time.h> // 静态全局变量 // 作用域:可以在本文件中使用、不可以在其他文件中使用 // 生命周期:程序创建到程序销毁 // 静态全局变量未初始化、值为0 static int c = 10; int main(void) { printf("%d\n", c); return 0; }
六、extern全局变量声明
声明一个变量,这个变量在别的文件中已经定义了,这里只是声明,而不是定义。
extern int a;
静态函数与全局函数
一、函数作用域
在C语言中函数默认都是全局的,使用关键字static可以将函数声明为静态,函数定义为static就意味着这个函数只能在定义这个函数的文件中使用,在其他文件中不能调用,即使在其他文件中声明这个函数都没用。对于不同文件中的staitc函数名字可以相同。
注意:
- 允许在不同的函数中使用相同的变量名,它们代表不同的对象,分配不同的单元,互不干扰。
- 同一源文件中,允许全局变量和局部变量同名,在局部变量的作用域内,全局变量不起作用。
- 所有的函数默认都是全局的,意味着所有的函数都不能重名,但如果是staitc函数,那么作用域是文件级的,所以不同的文件static函数名是可以相同的。
二、全局函数案例

#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h> #include <time.h> // 全局函数 // 添加函数声名 void fun03(); // 函数可以调用自己、称为递归函数 int main(void) { // 全局函数名称是作用域中唯一的 // 作用域:在整个项目中所有文件中使用 // 存储区域:代码区 fun03(); return 0; }
三、静态函数案例

#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h> #include <time.h> // 静态函数 // 作用域:当前文件中 // 静态函数可以和全局函数重名 // 生命周期:重程序创建到程序销毁 // 存储区域:代码区 static void fun03() { printf("%d\n", 10); } int main(void) { fun03(); return 0; }