Loading... # 变量的存储类别 ![做了解](https://blog.fivk.cn/usr/uploads/2021/03/3189565704.png) ## 普通局部变量: <div class="tip inlineBlock success"> * 定义形式:在{}里定义的普通变量 就是普通局部变量 ```C void test() { //{ } 这是复合语句 int num = 10;//普通局部变量 } ``` * 作用范围:离它最近的{}之间有效 ![](https://blog.fivk.cn/usr/uploads/2021/03/748529402.png) * 生命周期:离它最近的{}之间有效,离开{}的局部变量 系统自动回收(第6行) * 存储区域:栈区 * 注意事项: 1. 普通局部变量不初始化 内容不确定 ```C #include<stdio.h> int main() { //局部变量 不初始化 内容不确定 int data; printf("data = %d", data);//不确定 } ``` 2. 普通局部变量 同名 就近原则![](https://blog.fivk.cn/usr/uploads/2021/03/3978236067.png) </div> ## 普通全局变量: <div class="tip inlineBlock success"> * 定义形式:定义在**函数外边**的变量 就是普通全局变量 ![](https://blog.fivk.cn/usr/uploads/2021/03/270341739.png) * 作用范围:当前源文件都有效(在第3行定义,mian函数或其他函数中都可以识别。),其他源文件使用全局变量时必须加 extern 声明 ```C #include<stdio.h> extern int data;//声明 普通全局变量 不要赋初值 int data = 100;//定义 普通全局变量 int main() { printf("%d", data); } ``` //extren本质:告诉编译器 变量/函数 来自工程的其他源文件,请通过编译 ![一般其他源文件以头文件方式声明](https://blog.fivk.cn/usr/uploads/2021/03/3794283114.png) * 生命周期:整个进程 都有效(程序结束的时候 全局变量 才被释放)。 * 储存区域:全局区 注意事项: 1. 全局变量 不初始化 内容为0![](https://blog.fivk.cn/usr/uploads/2021/03/2640463138.png)因为全局变量在全局区bss段,会自动补0. 2. 如果全局变量 要在其他源文件中使用,必须要在所使用的源文件中加 extern 声明。 3. 如果全局变量和局部变量同名,在{}复合语句中优先使用局部变量![类似就近原则](https://blog.fivk.cn/usr/uploads/2021/03/266103635.png) </div> ## 静态局部变量 <div class="tip inlineBlock success"> * 定义形式:在{}复合语句中定义 前面必须加 static 修饰 这样的变量 叫 静态局部变量。 ```C void test() { static int num;//静态局部变量 return; } ``` ![](https://blog.fivk.cn/usr/uploads/2021/03/3838626159.png) * 作用范围:离它最近的{}符合语句之间有效。 ![这里未检测到num](https://blog.fivk.cn/usr/uploads/2021/03/1262123400.png) * 生命周期:整个进程。(程序结束的时候 静态局部变量 才被释放) //生命周期和全局变量相似因为他们本来就在一起的(bss区),地址相差不大。 ![image.png](https://blog.fivk.cn/usr/uploads/2021/03/2087750611.png) 所以结束函数不释放: <div class='album_block'> [album type="photos"] ![普通局部变量](https://blog.fivk.cn/usr/uploads/2021/03/1558006033.png) ![静态局部变量](https://blog.fivk.cn/usr/uploads/2021/03/3120521919.png) [/album] </div> //说明:图2 static int num = 100;只赋值一次。首先要搞懂初始化的作用。 //初始化:定义变量的时候赋值。 //定义变量:就是给变量开辟空间。 //赋值第一次的时候num这个变量已经被定义,所以不是初始化, 第二次执行函数时num = 100 不会被执行。 //**所以静态局部变量只能被初始化一次.** * 储存区域:全局区(刚刚看了,地址和生命周期都和全局变量相似) * 注意事项: 1. 静态局部变量 如果不初始化 内容为0。(全局区) 2. 只能被定义一次。(重要) </div> ## 静态全局变量 <div class="tip inlineBlock success"> * 定义形式:在函数外边定义同时加 static 这样的变量就是 静态局部变量 ```C #include<stdio.h> static int data = 10; //静态全局变量 int main(int argc, char* argv[]) { return 0; } ``` * 作用范围:当前源文件有效,不能在其他源文件中使用。 ![](https://blog.fivk.cn/usr/uploads/2021/03/117084988.png) //其他源代码不能直接使用,可以通过指针间接使用。 * 生命周期:整个进程(程序结束 静态全局变量才被释放) * 存储区域:全局区 * 注意事项: 1. 静态全局变量 不初始化 内容为 0。 2. 静态全局变量 只在当前源文件 有效 </div> ## 全局函数(普通函数) 和 静态函数(局部函数) <div class="tip inlineBlock success"> ##### 1、全局函数(普通函数): <div class='album_block'> [album type="photos"] ![main](https://blog.fivk.cn/usr/uploads/2021/03/3082024895.png) ![my_fun](https://blog.fivk.cn/usr/uploads/2021/03/1408679366.png) [/album] </div> * 特点:其他源文件 可以使用 全局函数,必须加 extren 声明 ##### 2、静态函数(局部变量): <div class='album_block'> [album type="photos"] ![main](https://blog.fivk.cn/usr/uploads/2021/03/3207417397.png) ![my_static_fun](https://blog.fivk.cn/usr/uploads/2021/03/3035106209.png) [/album] </div> * 特点:只能在当前源文件使用 不能在其他源文件使用。 * 套壳:我们可以通过调用其他函数间接的使用其他函数 ![](https://blog.fivk.cn/usr/uploads/2021/03/2287721701.png) 这里我们通过调用my_fun函数,封装局部函数。 * 注意:如果想在其他源文件 调用 静态函数 需要将静态函数 封装在 全局函数中。同时全局函数 和 静态函数 必须 是同一个源文件。 </div> # 作业: * main.c ```C #include<stdio.h> extern int va; extern int getG(void); extern int getO(void); int main(void) { printf("va = %d\n", va);//7 printf("getO = %d\n", getO());//18 printf("getG = %d\n", getG());//20 printf("%d", va * getO() * getG()); return 0; } ``` * fun1.c ```C int va = 7; int getG(void) { int va = 20; return va; } ``` * fun2.c ```C static int va = 18; static int getG(void) { return va; } int getO(void) { return getG(); } ``` * 问题:不运行代码,试问输出是什么。 <div class="tip inlineBlock info"> 博主学完这一节都猜出了答案^_^ </div> 最后修改:2021 年 03 月 19 日 © 禁止转载 打赏 赞赏作者 支付宝微信 赞 如果觉得我的文章对你有用,请随意赞赏