当前位置: 首页 > news >正文

【C语言】全局变量、静态本地变量

在C语言中,变量是存储数据的基本单元。

不同类型的变量有着不同的特性和用途,其中全局变量和本地变量是比较特殊且重要的两类变量。

一、全部变量

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

全局变量是在函数外部定义的变量,其作用域从定义的位置开始,直到源文件的末尾。

这就意味着,除了同名局部变量覆盖的区域外(也就是在函数内部同样变量名的变量所在的范围),所有函数都可以访问这个全局变量。

全局变量的生存周期从程序开始时创建,直到函数结束时才销毁,如:

  • 引入头文件
#include <stdio.h>
  • 定义全局变量
int g_var = 10; 
  • 在函数中
void function() {printf("在函数中访问全局变量: %d\n", g_var);
}
  • 在主函数中
int main() {function();printf("在主函数中访问全局变量: %d\n", g_var);return 0;
}

⬇️

图解 

1.2 全局变量的访问和使用

访问变量时,直接使用变量名即可。

在函数中修改全局变量的值,会影响到其他函数对该变量的访问。

不过,我并不推荐过多的使用全局变量,因为这样会导致代码的可读性和可维护性降低,因为变量的值可能在不同的函数中被修改,难以追踪其变化。

  • 引用头文件
#include <stdio.h>
  • 定义全局变量
int g_var = 0;
  • 对全局变量进行加法
void jiaf() {g_var ++;
}
  • 主函数
int main() {jiaf();printf("g_var = %d\n", g_var);return 0;
}

⬇️

1.3 全局变量的初始化和默认值

全局变量在定义时可以进行初始化。

如果没有显式初始化,全局变化会被自动初始化为0(对于数值类型)或空指针(对于指针类型)。

  • 引用头文件
#include <stdio.h>
  • 定义全局变量
int g_num; 
int g_arr[5]; 
  • 主函数(遍历全局变量并输出
int main() {printf("未初始化全局变量 g_num: %d\n", g_num);for (int i = 0; i < 5; i++) {printf("未初始化全局数组元素 g_arr[%d]: %d\n", i, g_arr[i]);}return 0;
}

⬇️

用表格来表示就是: 

变量声明是否初始化默认值
int g_num;0
int g_arr[5];数组元素均为 0

1.4 全局变量的隐藏和作用域

当局部变量和全局变量同名时,局部变量会隐藏全局变量。

在局部变量的作用域内,访问的是局部变量,而不是全部变量。

如果要在局部作用域访问被隐藏的全部变量,可以使用::作用域解析运算符(c++),但在C语言中没有这样的运算符,只能通过一些间接的方式来访问全局变量。

  • 引用头文件
#include <stdio.h>
  • 定义全局变量
int num = 10; 
  • 局部变量隐藏全局变量
void function() {int num = 20; printf("局部变量 num: %d\n", num);
}
  • 全局变量
int main() {function();printf("全局变量 num: %d\n", num);return 0;
}

 ⬇️

图解 

二、静态本地变量

2.1 静态本地变量的特性

静态本地变量实在函数内部使用static关键字声明的变量。

它的特性包括:只在第一次调用函数时进行初始化,之后调用函数时候不会再次初始化;变量的值在函数调用之间保持不变。

2.2 静态本地变量的执行过程

当程序首次调用包含静态本地变量的函数时,系统会在静态存储区为该变量分配内存。

要是变量在声明时有初始化值,那么就会执行初始化操作;要是没有显式初始化,数值类型的静态本地变量会被自动初始化为0,指针类型则会被初始化为空指针。

函数执行期间,静态本地变量能够参与各类运算,其值会依据函数内的操作而改变。当函数执行完毕返回时,静态本地变量所占用的内存空间不会释放,它的值会保存在内存中。之后再次调用这个函数时,不会对静态本地变量重新初始化,而是直接使用上次函数调用结束时该变量保存的值。

·引用头文件

#include <stdio.h>

·定义静态本地变量

void jishu() {static int jingtai = 0;jingtai++;printf("函数被调用了 %d 次\n", jingtai);
}

·主函数

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

⬇️

 

2.3 静态本地变量实际上是全局变量

从内存分配的角度来看,静态本地变量和全局变量存在相似之处。

静态本地变量和全局变量都存于静态存储区,在程序开始执行时就会被分配内存,并且在程序的整个运行期间都存在,

不过,静态本地变量的作用域被限时在定义它的函数内部,在函数外部无法直接访问,这和全局变量有所不同。

·引用头文件

#include <stdio.h>

·定义全局变量

int quanju = 10;

·定义静态变量&分别打印静态变量和全局变量的地址

void testFunction() {static int jingtai = 20;printf("全局变量 quanju 的地址: %p\n", &quanju);printf("静态本地变量 jingtai 的地址: %p\n", &jingtai);
}

·主函数

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

⬇️

 

2.4 静态本地变量的生存期和作用域

生存期

静态本地变量的生存期从程序开始执行一直到程序结束,这和全局变量是一样的。也就是说,在程序运行期间,不管函数被调用多少次,静态本地变量始终存在于内存中,其值会一直保持。

作用域

静态本地变量的作用域是定义它的函数内部。在该函数外部,无法直接访问这个静态本地变量。


个人主页

最近生病了,真的特别难受,还有之前期中有点忙就没更新

相关文章:

  • 常见的几种分块策略,每种策略都有适用场景和优缺点
  • 华为L410上制作内网镜像模板:搭建Apache服务器并上传离线WeChat包
  • Linux-05 半个月崩了三次 ubuntu 系统记录
  • 基于STM32、HAL库的ADS1256IDBR模数转换器ADC驱动程序设计
  • 常见的6种外挂获取执行时机方法介绍
  • 安全编排自动化与响应(SOAR):从事件响应到智能编排的技术实践
  • 常见游戏引擎介绍与对比
  • Linux的基础指令
  • Exposure Adjusted Incidence Rate (EAIR) 暴露调整发病率:精准量化疾病风险
  • 关于hbaseRegion和hbaseRowKey的一些处理
  • linux ptrace 图文详解(七) gdb、strace跟踪系统调用
  • Python解析地址中省市区街道
  • Codeforces Round 1020 (Div. 3) A-D
  • 【高频考点精讲】ES6 String的新增方法,处理字符串更方便了
  • Unreal制作角色冲锋时冲击波效果
  • 论文学习:《聚类矩阵正则化指导的层次图池化》
  • 数学基础 -- 欧拉恒等式的魅力:让复数旋转起来!
  • 通信算法之273 : 循环自相关函数和自相关函数
  • LeNet5 神经网络的参数解析和图片尺寸解析
  • uniapp 常用开发技巧与实战指南
  • “冲刺万亿城市”首季表现如何?温州领跑,大连GDP超徐州
  • 新华时评·首季中国经济观察丨用好用足更加积极的财政政策
  • 生于1987年,万宏宇已任内蒙古鄂温克旗委常委
  • 金正恩出席朝鲜人民军海军驱逐舰入水仪式
  • 政治局会议:创设新的结构性货币政策工具,设立新型政策性金融工具,支持科技创新、扩大消费、稳定外贸等
  • 牛市早报|商务部:目前中美之间未进行任何经贸谈判