第二篇C语言中,变量的生命周期与作用域,全局变量与局部变量的定义与详细说明。

本文详细讲解了变量的生命周期和作用域,包括局部变量在栈区的分配、全局变量在数据段的行为,以及它们的初始化、申请空间和释放时机。通过实例和思考题,阐述了全局变量与局部变量的不同之处,并探讨了它们在程序中的使用场景和命名规则。

一、变量的生命周期与作用域?
1、什么是生命周期?
生命周期:这个变量从什么时候开始出现在内存空间中到什么时候从内存空间中释放。

2、什么是作用域?
作用域:这个变量能够在程序中作用到的地方。

根据生命周期与作用域可以将变量划分为两类:一类是局部变量、一类是全局变量。

3、什么是局部变量?什么是全局变量?
在程序中函数体内部定义的变量就是局部变量。
int main()
{
    int x;  //局部变量
}

在程序中函数体外部定义的变量就是全局变量。

int x;  //全局变量
int main()
{

}

4、局部变量与全局变量生命周期有什么区别?
问题一: 内存空间区域分布:
栈区(stack): 局部变量的所在地。
数据段(bss): 未初始化的全局变量。
数据段(data):已初始化的全局变量。
常量区(rodata):常量所在地。

假设有一个程序:

int a;           --> 未初始化的全局变量
int b = 20;      --> 已初始化的全局变量

int main()
{
    int c;      --> 未初始化的局部变量
    int d = 30; --> 已初始化的局部变量
    return 0;
}

当以上的程序运行时,以上的变量会在哪里申请空间?
结论1:只要是局部变量,不管有没有初始化,都是在栈区申请空间。
结论2:只要是常量,都会在常量区申请空间,例如20/30就是在常量区。
结论3:全局变量,如果没有初始化过,就会在bss段。
结论4:全局变量,如果已经初始化过,就会在data段。

问题二:全局变量与局部变量什么时候申请,什么时候释放?
申请:
常量区与数据段的数据在编译阶段就已经确定地址了。   gcc xxx.c -o xxx 之后就已经确定了
栈区的数据必须在运行的时候才会运行。               ./xxx            之后才能确定

int a;           --> 未初始化的全局变量
int b = 20;      --> 已初始化的全局变量

int main()
{
    int c;      --> 未初始化的局部变量
    int d = 30; --> 已初始化的局部变量
    return 0;
}

编译时候: a,b,20,30的空间已经确定了
运行时候: 需要代码运行到int c,int d这行代码时候,才会为c,d申请空间。

释放:
常量区与数据段的数据必须在程序结束之后,由系统来回收。
栈区的数据在该函数返回时,就会释放。

int x;    --> 全局变量
      --> 一开始编译完就申请了

void func()
{
    int a;   --> 局部变量
         --> 运行到这行代码才会申请a的空间

    .......;    
    .......;
    .......; --> 在此期间,a的空间一直在
    .......;

    return 0; -> 定义a的函数已经返回,所以a的空间就在这行代码执行之后释放。
}

int main()
{
    printf("helloworld!\n");   --> a的空间的还没有申请

    func();

    printf("helloworld");   --> a的空间已经释放掉了

    return 0;  //程序结束  系统就会回收x的空间
}

5、局部变量与全局变量作用域区别?
全局变量一开始就申请,到程序结束才会释放,所以全局变量在整个程序中都可以使用。
局部变量在申请这个变量的函数返回时,就会释放,所以局部变量只能作用于这个函数之内。

#include <stdio.h>

int x = 10;

void func()
{
    int a = 20;
    printf("x = %d\n",x);  //x = 10
    printf("a = %d\n",a);  //a = 20
}


int main()
{
    printf("x = %d\n",x);  //x = 10
    printf("a = %d\n",a);  //编译报错

    func();

    printf("x = %d\n",x);  //x = 10;
    printf("a = %d\n",a);  //编译报错

    return 0;
}

6、全局变量与局部变量初始值分别是什么?
#include <stdio.h>

//全局变量如果没有赋值,那么就会赋值0
int e;
int f;
int g;
int h;

int main()
{
    // 局部变量如果没有赋值,那么就会赋值一个随机值
    int a;
    int b;
    int c;
    int d;

    printf("a = %d\n",a);
    printf("b = %d\n",b);
    printf("c = %d\n",c);
    printf("d = %d\n",d);
    printf("e = %d\n",e);
    printf("f = %d\n",f);
    printf("g = %d\n",g);
    printf("h = %d\n",h);

    return 0;
}

二、关于全局变量与局部变量的思考题。
1、形式参数属于局部变量还是全局变量?
void func(int x)  //x=10   x 形参

}

int main()
{
    func(10);  //10 实参
}
答案: 形式参数x也是属于局部变量。

2、能不能在不同的函数中定义相同的变量名?

void func()
{
    int a;
}

int main()
{
    int a;
    func();
}
答案:OK的,在func中打印的就是func的a,在main中打印的就是main的a。

3、全局变量可以跟局部变量同名吗?如果可以,那么会输出哪个值?

#include <stdio.h>
int x = 10;
int main()
{
    int x = 20;
    printf("x = %d\n",x);
}
答案:可以同名,会输出局部变量。

4、有以下的代码,请问程序的输出结果是什么?

void func()
{
    printf("x = %d\n",x);
    return;
}

int x = 10;

int main()
{
    func();
    return 0;
}

编译出错,全局变量的作用域只能往下,不能往上。


    练习:求出以下程序的结果,可以通过画内存条的方式来回答。

int my_fun(int z)
{
    z = z/5;
    return z;
}

int func(int x,int y)
{
    int c;
    c = x + y;
    my_fun(c);
    return c;
}

int main(int argc,char *argv[])
{
    int a = 10,b = 5;
    int ret = func(a,b);
    printf("ret = %d\n",ret);
    return 0;
}    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

肖爱Kun

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值