C语言全局变量和局部变量的区别

本文详细介绍了全局变量、静态全局变量、局部变量和静态局部变量的概念、作用范围及生命周期。全局变量在整个程序中有效,静态全局变量限制于定义的源文件。局部变量在函数内部生效,静态局部变量在函数调用中保持其值。通过示例代码展示了不同类型的变量在程序执行中的行为差异,帮助理解它们的特点和用法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 普通的全局变量

1.1 概念

在函数外部定义的变量

int num = 100;	// num就是一个全局变量
int main()
{
   return 0;
}

1.2 作用范围

全局变量的作用范围,是程序的所有地方
只不过用之前需要声明。
声明方法extern int num;
注意声明的时候,一般不进行赋值

1.3 生命周期

程序运行的整个过程,一直存在,直到程序结束
注意:定义普通的全局变量的时候,如果不赋初值,它的值默认为0

#include <stdio.h>

// 定义一个普通全局变量
// 只要在main函数外(也在子函数外)的变量,就是全局变量
// 如果全局变量没有进行初始化,则系统自动将其初始化为0
int num;

// 全局变量可以在程序的任意一个位置进行对其的操作
void function()
{
    num = 888;
}
int main(int argc, char *argv[])
{
    printf("num = %d\n",num);
    function();
    printf("num = %d\n",num);
    return 0;
}

执行结果:
在这里插入图片描述

2 静态全局变量

2.1 概念

定义全局变量的时候,前面使用static来修饰

static int num = 100;		// num就是一个静态全局变量
int main()
{
   return 0;
}

2.2 作用范围

static限定了静态全局变量的作用范围
只在它定义的.c(源文件)中有效

2.3 生命周期

在程序的整个运行过程中,一直存在。
注意:定义静态全局变量的时候,如果不赋初值,它的默认值是0

#include <stdio.h>

// 定义一个静态全局变量
// 静态全局变量只能在其定义的.c文件中任意位置使用,不能跨文件使用
static int num;
void function()
{
    num++;
}

int main(int argc, char *argv[])
{
    printf("num = %d\n",num);
    function();
    printf("num = %d\n",num);
    return 0;
}

执行结果:
在这里插入图片描述

3 普通的局部变量

3.1 概念

在函数内部定义的,或者复合语句中定义的变量

int main()
{
   int num;	// 局部变量
   {
      int a;	// 局部变量
   }
}

3.2 作用范围

在函数定义的变量,在函数中有效

在复合语句中定义的,在复合语句中有效

3.3 生命周期

在函数调用之前,局部变量不占用空间,调用函数的时候,才为局部变量开辟空间,函数结束了,局部变量就释放了。在复合函数中的定义亦如此。

#include <stdio.h>

// 定义一个局部变量
// 在函数内部定义的,不加任何修饰的变量都是局部变量

void function()
{
    int num = 100;
    num++;
    printf("num = %d\n",num);
    return ;
}

int main(int argc, char *argv[])
{
    // 局部变量只能在定义的函数的内部使用,生命周期相对较短,函数结束,局部变量就会释放掉。
    // 故printf("num = %d\n",num);运行会出错,
    // 原因就是局部变量的的作用范围只在函数内部或者复合语句内部有用,在主函数中没有定义
    //printf("num = %d\n",num);

    // 三次调用函数输出的结果是一样的
    // 还是作用范围,当function函数执行完毕后,
    // 局部变量就释放掉了,所以再次调用函数function还是会对num进行初始化(开辟空间)
    function();
    function();
    function();
    return 0;
}

执行结果:
在这里插入图片描述

4 静态的局部变量

4.1 概念

定义局部变量的时候,前面加static修饰

4.2 作用范围

在它定义的函数或复合语句中有效。

4.3 生命周期

第一次调用函数的时候,开辟空间赋值,函数结束后,不释放,以后在调用函数的时候,就不再为其开辟空间,也不赋初值,用的就是以前的那个变量。

#include <stdio.h>

// 定义一个静态局部变量
// 在函数内部定义的,不加任何修饰的变量就是静态局部变量

void function()
{
    // 如果普通局部变量不进行初始化,则默认值是随机值
    // 如果静态局部变量不进行初始化,则默认值是0;
    int a;  // 普通局部变量
    static int num; // 静态局部变量

    printf("a = %d\n",a);
    printf("num = %d\n",num);
    return ;
}

void function1()
{
    // 静态局部变量不会随着当前函数执行结束而释放空间,下次使用的函数之前的空间
    // 静态局部变量只会初始化一次
    static int num1 = 100;
    num1++;
    printf("num1 = %d\n",num1);
}

int main(int argc, char *argv[])
{
    // 调用function函数
    function();

    // 调用function1函数
    // 由于静态局部变量只会初始化一次,所以它的值会累加。重复调用不会重新开辟空间。
    function1();
    function1();
    function1();
    return 0;
}

执行结果:
在这里插入图片描述

5 总结

  1. 定义普通局部变量,如果不赋初值,它的值是随机的。

    定义静态局部变量,如果不赋初值,它的值是0

  2. 普通全局变量,和静态全局变量如果不赋初值,它的值为0

  3. 被static修饰的局部变量:

    ​ 生命周期:从定义开始,到整个程序截至(被延长)

    ​ 作用域:模块括号内有效

  4. 被static修饰的全局变量:

    ​ 生命周期:从定义开始,到整个源程序截至

    ​ 作用域:服务于本文件(被缩短)

编程学习笔记

### C语言全局变量局部变量区别 #### 定义位置 全局变量是在函数外部定义的变量,其作用域可以覆盖整个源文件或多个源文件(如果通过`extern`关键字声明)。而局部变量则是在函数内部定义的,在该函数体内有效。 #### 存储方式 对于存储类别而言,全局变量默认具有静态生存期(static storage duration),意味着这些变量会在程序启动时初始化并持续存在于内存直到程序结束[^1]。相反,局部变量通常拥有自动存储类型(auto storage class),即当进入函数调用栈帧时创建,并在退出此函数后立即被销毁[^2]。 #### 初始化行为 未显式初始化的情况下,编译器会将全局变量设置为零值;然而未经赋初值的局部变量的内容将是不确定的垃圾数据[^3]。 #### 访问权限控制 可以通过添加`static`关键字使全局变量仅限于当前文件可见,从而减少命名冲突的风险。同样地,也可以利用`static`修饰符让某个特定函数内的局部变量保持其上次执行后的状态不变,实现类似于持久化的效果。 #### 示例代码展示差异 下面的例子展示了如何区分这两种类型的变量: ```c #include <stdio.h> // 全局变量声明 int globalVar = 5; void functionA(){ // 局部变量声明 int localVar = 10; printf("Inside Function A:\n"); printf("Global Variable Value: %d\n", globalVar); printf("Local Variable Value : %d\n", localVar); } int main(){ // 修改全局变量 ++globalVar; functionA(); // 尝试访问functionA中的局部变量会导致错误 //printf("Outside any functions, trying to access local variable will cause an error.\n"); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

DA0221

各位看官您往里面瞧一瞧看一看

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

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

打赏作者

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

抵扣说明:

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

余额充值