栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

第二篇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

int x = 10;

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


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

    func();

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

    return 0;
}

6、全局变量与局部变量初始值分别是什么?
#include

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

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

    printf("a = %dn",a);
    printf("b = %dn",b);
    printf("c = %dn",c);
    printf("d = %dn",d);
    printf("e = %dn",e);
    printf("f = %dn",f);
    printf("g = %dn",g);
    printf("h = %dn",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
int x = 10;
int main()
{
    int x = 20;
    printf("x = %dn",x);
}
答案:可以同名,会输出局部变量。

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

void func()
{
    printf("x = %dn",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 = %dn",ret);
    return 0;
}    

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/691803.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号