本地变量和全局变量

发布于:2023-01-12 ⋅ 阅读:(220) ⋅ 点赞:(0)

1 本地变量

定义在函数体内的变量称为本地变量

1.1 本地变量定义时不初始化,则初值为任意值

1.2 本地变量的作用域与生存周期

本地变量的生存周期是从进入函数产生,退出函数消亡。本地变量的作用域在函数内。

1.3 静态本地变量

在本地变量前加上关键字stati,则一般本地变量变成静态本地变量。静态本地变量的作用域不变,但生存周期改变,其退出函数时,内存空间不释放,等下一次进入函数时值为上次进入时的值。如下代码所示:

#include<stdio.h>

void get_value(void);

void main(void)
{
    printf("第1次进入get_value函数:\n");
    get_value();
    printf("第2次进入get_value函数:\n");
    get_value();
}

void get_value(void)
{
    int a=0;
    static int b=0;
    printf("加之前a=%d,b=%d\n",a,b);
    a++;
    b++;
    printf("加之后a=%d,b=%d\n",a,b);
}

运行结果为:

第1次进入get_value函数:
加之前a=0,b=0
加之后a=1,b=1
第2次进入get_value函数:
加之前a=0,b=1
加之后a=1,b=2

而且,静态本地变量与本地变量并不存放在一个区域,和全局变量存放在一个区域。如下代码所示:

#include<stdio.h>

int c=0;
void get_value(void);

void main(void)
{
    get_value();
}

void get_value(void)
{
    int a=0;
    static int b=0;
    printf("本地变量a的地址    :%p\n",&a);
    printf("静态本地变量b的地址:%p\n",&b);
    printf("全局变量c的地址    :%p\n",&c);
}

运行结果为:

本地变量a的地址    :000000000061FDEC
静态本地变量b的地址:0000000000407034
全局变量c的地址    :0000000000407030

2 全局变量

全局变量是指在函数体外定义的变量。

2.1 全局变量初始化

全局变量定义时不初始化,则默认值为0.且全局变量的初始化只能用编译时确定的值进行,包含其之前的const 量。

2.1 全局变量的作用域和生存周期

作用域:一般是整个代码文件,但是如果在函数体内或代码块内定义了同名局部变量,则在该函数体内或代码块内,同名局部变量的优先级更高。

生存周期:整个代码文件内

3 函数返回本地变量的指针

本地变量在其所定义的函数运行完后并未立即释放,只是失去控制。当另一个函数用到它的内存时,被那一个函数控制。所以函数返回指针一般不反回本地变量的指针。

4 一些建议

4.1 不建议使用全局变量来给函数传参

4.2 不建议在代码中大量使用全局变量和静态本地变量,这可能会带来一些问题。


网站公告

今日签到

点亮在社区的每一天
去签到