欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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函数名字可以相同
C语言学习第011课——内存管理
注意:

  • 允许在不同的函数中使用相同的变量名,他们代表不同的对象,分配不同的单元,互不干扰
  • 同一源文件中,允许全局变量和局部变量同名,在局部变量的作用域内,全局变量不起作用
  • 所有的函数都默认是全局的,意味着所有的函数都不能重名,但如果是static函数,那么作用域是文件级的,所以不同的文件static函数名是可以相同的