目录
画师:竹取工坊
有帮助的话可以到主页:Mem0rin给主包点一个小小的关注~
欢迎关注互三,一起交流进步!
目录
一、作用域
这是一个程序设计概念,指的是限定变量名的可用性的代码范围。
在此基础上,变量分为两种:全局变量和局部变量
全局变量的作用域是整个代码文档,
局部变量的作用域是变量所在的局部区域。
比如在代码内
#include<stdio.h>
int m = 10;
int mul(int y) { return y * y;}
int square(int x) { return mul(x) + m;}
int main() { int a = m; scanf("%d", &a); if (a > 10) { int b = square(a); printf("%d", b); } return 0;}b的作用域是if语句的大括号内的区域,a的作用域是main函数的大括号内,x和y的作用域分别是square和mul函数的大括号内部,m的作用域是整个代码。
可以发现,a是可以进入if语句的大括号内部的,但是反之不行,如果在if语句外部使用变量b就会报错。
全局变量m可以到main可以到square可以到mul。
如果在工程中要跨文件访问全局变量,可以使用extern声明一个定义在别处的**全局变量。**从其他的代码文件中提取全局变量使用
此外extern还可以声明全局函数。
二、生命周期
指的是变量从创建到销毁的过程
全局变量的生命周期是整个程序,
局部变量的生命周期是所在的作用域中变量创建到出作用域的过程。
三、存储区域
**变量的生命周期是由变量的存储区域决定的。**因此我们现在将考察变量的存储区域及其对应的生命周期。可以列出下表:
| 存储区域 | 常见变量 | 生命周期 |
|---|---|---|
| 栈(stack) | 普通局部变量、函数形参 | 自动存储期 |
| 堆(heap) | malloc / calloc | 动态存储期 |
| 静态区 / 全局区 | 全局变量、static 变量 | 静态存储期 |
| 常量区 | 字符串字面量 | 静态存储期 |
| 代码区 | 函数代码 | 程序全程 |
在栈和堆的变量,在离开作用域之后就会自动销毁,我们平时在函数中定义的局部变量,函数形参都是这样。全局变量储存在静态区,程序没有结束就不会销毁。
staic修饰局部变量
那么如果我们不想让局部变量销毁,而是不断地进行累加呢?从表格可以得知,我们可以用static进行修饰。
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
void add(int x) { static a = 2; a++; printf("%d ", a);}
int main() { int a = 1; printf("%d ", a); add(a); printf("%d ", a); add(a); printf("%d ", a); add(a); printf("%d ", a); return 0;}
>>>1 3 1 4 1 5 1如果把static去掉就是1 3 1 3 1 3 1了,可以发现add函数中的a并没有被销毁然后从头开始,而是在不断累加的。但是和全局变量不同的是,它的作用域依旧是add函数内部,static只是把变量的存储区域进行转移,从而改变了它的生命周期。
static修饰全局变量
static也可以修饰全局变量。还记得extern可以从外部文件中调用全局变量吗,static的作用就是让全局变量不会被extern拿去使用,从而只能在该文件内使用。
本质上是因为全局变量自身是有外部链接属性的,被static声明之后就变成内部链接属性,只能在该源文件内部使用。
static修饰全局函数
和修饰全局变量同理,会把全局函数的外部链接属性改成内部链接属性,只能在这个源文件内部使用。
部分信息可能已经过时












