C语言学习第011课——内存管理
程序员文章站
2022-05-12 16:32:50
...
作用域
C语言变量的作用域分为
- 代码块作用域(代码块是{}之间的一段代码)
- 函数作用域
- 文件作用域
局部变量
局部变量也叫auto自动变量(auto可写可不写),一般情况下函数内部定义的变量都是局部变量
#include<stdio.h>
int main(void){
int a = 10;
printf("%d\n",a);
}
以上就定义了一个局部变量
作用域:从变量定义到函数结束
声明周期:从创建到函数结束
形参也是局部变量
静态(static)局部变量
- static局部变量的作用域也是在定义的函数内有效
- static局部变量的生命周期和程序运行周期一样,同时static局部变量的值只初始化一次,但可以赋值多次
- static局部变量若未赋以初值,则由系统自动赋值,数值型变量自动赋初值0,字符型变量赋空字符
全局变量
- 在函数外定义,可被本文件及其他文件中的函数所共用,若其他文件中的函数调用此变量,必须用extern声明
- 全局变量的生命周期和程序运行周期一样
- 不同文件的全局变量不可重复
- 全局变量存放在数据区
#include<stdio.h>
int a = 10; 定义一个全局变量
int main(void){
int a = 100; 局部变量可以和全局变量重名,而且可以改变到全局变量的值
printf("%d\n",a); 运行结果:100
}
#include<stdio.h>
int a = 10;
int main(void){
printf("%d\n",a); 运行结果:10
int a = 100;
printf("%d\n",a); 运行结果:100
}
#include<stdio.h>
int a = 10;
int main(void){
printf("%d\n",a); 运行结果:10
下面这种直接用大括号括起来的代码,叫匿名内部函数,存放在栈区,大括号结束即出栈,占用的内存会从内存中销毁
{
int a = 123;
printf("%d\n",a); 运行结果:123
}
int a = 100;
printf("%d\n",a); 运行结果:100
}
#include<stdio.h>
int a = 10;
int main(void){
printf("%d\n",a);
{
a = 123; 这里少写了一个int,表示使用的是全局变量,而不是局部变量,a的值不会被回收
printf("%d\n",a); 运行结果:123
}
printf("%d\n",a); 运行结果:123
int a = 100;
printf("%d\n",a); 运行结果:100
}
静态(static)全局变量
- 在函数外定义,作用范围被限制在所定义的文件中
- 不同文件静态全局变量可以重名,但作用域不冲突
- static全局变量的生命周期和程序运行周期一样,同时static全局变量的值只初始化一次
extern全局变量声明
extern int a;
声明一个变量,这个全局变量在别的文件中已经定义了,这里只是声明,而不是定义。
全局函数和静态函数
在C语言中函数默认都是全局的,使用关键字static可以将函数声明为静态,函数定义为static就意味着这个函数只能在定义这个函数的文件中使用,在其他文件中不能调用,即使在其他文件中声明这个函数都没用。
对于不同文件中的static函数名字可以相同
注意:
- 允许在不同的函数中使用相同的变量名,他们代表不同的对象,分配不同的单元,互不干扰
- 同一源文件中,允许全局变量和局部变量同名,在局部变量的作用域内,全局变量不起作用
- 所有的函数都默认是全局的,意味着所有的函数都不能重名,但如果是static函数,那么作用域是文件级的,所以不同的文件static函数名是可以相同的
上一篇: 5.1 printf()函数详解
下一篇: 方法(一)