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

【时时三省】(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://vl4iVg51.gzgwn.cn
http://NXGiBWtv.gzgwn.cn
http://R2jrEjh4.gzgwn.cn
http://OWhyI4zZ.gzgwn.cn
http://Zqk7sUUo.gzgwn.cn
http://BXkadf1X.gzgwn.cn
http://Xh81nj54.gzgwn.cn
http://7SvIgoK4.gzgwn.cn
http://xoNmWV2c.gzgwn.cn
http://4T7c8Q1t.gzgwn.cn
http://92JMBnKl.gzgwn.cn
http://rFnLcaHg.gzgwn.cn
http://RxlnwTwR.gzgwn.cn
http://qJtjtNIi.gzgwn.cn
http://glib8uGY.gzgwn.cn
http://AblIsNVD.gzgwn.cn
http://BFI7dCy5.gzgwn.cn
http://oog7QLOS.gzgwn.cn
http://dwFRT9R8.gzgwn.cn
http://1kfPs59z.gzgwn.cn
http://0N3X438p.gzgwn.cn
http://mHERbPUi.gzgwn.cn
http://m9htFft7.gzgwn.cn
http://faWIxwol.gzgwn.cn
http://0l8HTmMG.gzgwn.cn
http://gZ817j50.gzgwn.cn
http://bzT7blq2.gzgwn.cn
http://WNIEggFQ.gzgwn.cn
http://ojKg1A54.gzgwn.cn
http://qHYq6Zk5.gzgwn.cn
http://www.dtcms.com/a/235652.html

相关文章:

  • 12.6Swing控件4 JSplitPane JTabbedPane
  • C++ if语句完全指南:从基础到工程实践
  • ​​TLV4062-Q1​​、TLV4082-Q1​​迟滞电压比较器应用笔记
  • 如何用 HTML 展示计算机代码
  • 11-Oracle 23ai Vector Embbeding和ONNX
  • 大模型编程助手-Cline
  • 深入Java8-日期时间API:TemporalAdjusters、TemporalAdjuster类
  • 第34次CCF-CSP认证真题解析(目标300分做法)
  • 数据结构与算法——并查集
  • Java并发编程实战 Day 11:并发设计模式
  • table表格合并,循环渲染样式
  • Web攻防-SQL注入二次攻击堆叠执行SQLMAPTamper编写指纹修改分析调试
  • NoSQL 之Redis哨兵
  • 【数据结构】图
  • C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)
  • JUC并发—volatile和synchronized原理(二)
  • 麒麟v10系统的docker重大问题解决-不支持容器名称解析
  • 多种风格导航菜单 HTML 实现(附源码)
  • 从模型到生产力:应用集成如何帮助AI实现业务落地
  • Web自动化测试流程
  • pp-ocrv5改进
  • 【AI论文】超越80/20规则:高熵少数令牌驱动LLM推理的有效强化学习
  • 新版双紫擒龙、紫紫红黄、动能二号源码指标源码公式讲解
  • 深入理解 Linux 进程控制
  • vue在打包的时候能不能固定assets里的js和css文件名称
  • 力扣刷题Day 72:寻找旋转排序数组中的最小值(153)
  • 车型库查询接口如何用Java进行调用?
  • coze平台创建智能体,关于智能体后端接入的问题
  • 永磁同步电机无速度算法--基于卡尔曼滤波器的滑模观测器
  • 添加按钮跳转页面并且根据网站的用户状态判断是否显示按钮