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

【时时三省】(C语言基础)局部变量和全局变量

山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省

以前所见到的程序大多数是一个程序只包含一个main函数,变量是在函数的开头处定义的。这些变量在本函数范围内有效,即在本函数开头定义的变量,在本函数中可以被引用。在本章中见到的一些程序,包含两个或多个函数,分别在各函数中定义变量。有的读者自然会提出一个问题:在一个函数中定义的变量,在其他函数中能否被引用?在不同位置定义的变量,在什么范围内有效?

这就是变量的作用域问题。每一个变量都有一个作用域问题,即它们在什么范围内有效。

局部变量

定义变量可能有3种情况:

( 1 )在函数的开头定义;

( 2 )在函数内的复合语句内定义;

( 3 )在函数的外部定义。

在一个函数内部定义的变量只在本函数范围内有效,也就是说只有在本函数内才能引用它们,在此函数以外是不能使用这些变量的。在复合语句内定义的变量只在本复合语句范围内有效,只有在本复合语句内才能引用它们。在该复合语句以外是不能使用这些变量的,以上这些称为“局部变量”。

例如,在funl函数中定义了变量a,b,在fun2函数中定义了变量a. c。funl函数中的变量a和fun2函数中的变量a不是同一个对象。它们分别有自己的有效范围。正如高一甲班有一学生叫王建国,高一乙班也有一学生叫王建国,二者不是同一个人。不同的班允许有同名的学生,互不干扰。高一甲班点名时,只有该班的王建国喊“到”,乙班的王建国不在甲班活动,不会同时喊“到”的。他们的活动范围局限在本班,或者说这些名字的有效范围是局部的(只在本班有效)。

例如:

float fl ( int a )

{

int b,c;

...

}

a,b,c有效

char f2 ( int x , int y )

{

int i , j ;

...

}

x,y,i,j有效

int main ( )

{

int m , n ;

return 0;

...

}

m,n有效

说明:

( 1 )主函数中定义的变量(如m , n )也只在主函数中有效,并不因为在主函数中定义而在整个文件或程序中有效。主函数也不能使用其他函数中定义的变量。

( 2 )不同函数中可以使用同名的变量,它们代表不同的对象,互不干扰。例如,上面在f1函数中定义了变量b和c,倘若在f2函数中也定义变量b和c ,它们在内存中占不同的单元,不会混淆。

( 3 )形式参数也是局部变量。例如上面fl函数中的形参a,也只在fl函数中有效。其他函数可以调用fl函数,但不能直接引用fl函数的形参a(例如想在其他函数中输出a的值是不行的)。

( 4 )在一个函数内部,可以在复合语句中定义变量,这些变量只在本复合语句中有效,这种复合语句也称为“分程序”或“程序块”。

全局变量

程序的编译单位是源程序文件,一个源文件可以包含一个或若干个函数。在函数内定义的变量是局部变量,而在函数之外定义的变量称为外部变量,外部变量是全局变量(也称全程变量)。全局变量可以为本文件中其他函数所共用。它的有效范围为从定义变量的位置开始到本源文件结束。

注意:在函数内定义的变量是局部变量,在函数外定义的变量是全局变量。

例如:

int p = 1,q = 5;//定义外部变量

float f1 ( int a ) //定义函数f1

{

int b,c;

...

}

char c1,c2;

char f2 ( int x , int y )

{

int i , j ;

}

int main ( ) //主函数

{

int m , n ;

...

return 0 ;

}

p,q,cl,c2都是全局变量,但它们的作用范围不同,在main函数和f2函数中可以使用全局变量p,q,cl,c2,但在函数fl中只能使用全局变量p,q,而不能使用c1和c2。

在一个函数中既可以使用本函数中的局部变量,也可以使用有效的全局变量。打个通俗的比方:国家有统一的法律和法规,各省还可以根据需要制定地方的法律和法规。在甲省,国家统一的法律法规和甲省的法律法规都是有效的,而在乙省,则国家统一的法律法规和乙省的法律法规有效。显然,甲省的法律法规在乙省无效。

说明:

设置全局变量的作用是增加了函数间数据联系的渠道。由于同一文件中的所有函数都能引用全局变量的值,因此如果在一个函数中改变了全局变量的值,就能影响到其他函数中全局变量的值。相当于各个函数间有直接的传递通道。由于函数的调用只能带回一个函数返回值,因此有时可以利用全局变量来增加函数间的联系渠道,通过函数调用能得到一个以上的值。

为了便于区别全局变量和局部变量,在C程序设计人员中有一个习惯(但非规定),将全局变量名的第1个字母用大写表示。

http://www.lryc.cn/news/2403316.html

相关文章:

  • An improved YOLACT algorithm for instance segmentation of stacking parts
  • 使用API网关Kong配置反向代理和负载均衡
  • BugKu Web渗透之eval
  • DAY45 可视化
  • 11.RV1126-ROCKX项目 API和人脸检测画框
  • 超构光学与 AR 的深度融合 | 攻克 VAC 与眼动范围难题
  • [ Qt ] | 与系统相关的操作(三):QFile介绍和使用
  • RetroMAE 预训练任务
  • 软件工程:如何做好软件产品
  • 蓝桥杯 省赛 2025python(B组)题目(分析)
  • React - 组件通信
  • 《前端面试题:CSS的display属性》
  • 飞牛使用Docker部署Tailscale 内网穿透教程
  • 《数据挖掘》- 房价数据分析
  • centos中的ulimit命令
  • git提交代码和解决冲突修复bug
  • 华为仓颉语言初识:并发编程之同步机制(上)
  • php中实现邮件发送功能
  • C++之动态数组vector
  • arc3.2语言sort的时候报错:(sort < `(2 9 3 7 5 1)) 需要写成这种:(sort > (pair (list 3 2)))
  • Android动态广播注册收发原理
  • Ubuntu 系统通过防火墙管控 Docker 容器
  • AI 模型分类全解:特性与选择指南
  • 【Zephyr 系列 11】使用 NVS 实现 BLE 参数持久化:掉电不丢配置,开机自动加载
  • 【Android】Android Studio项目代码异常错乱问题处理(2020.3版本)
  • n皇后问题的 C++ 回溯算法教学攻略
  • 一些免费的大A数据接口库
  • DeepSeek本地部署及WebUI可视化教程
  • 机器学习算法时间复杂度解析:为什么它如此重要?
  • SSIM、PSNR、LPIPS、MUSIQ、NRQM、NIQE 六个图像质量评估指标