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

【时时三省】(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.xdnf.cn/news/12515.html

相关文章:

  • CSDN文章下载到本地的完整指南
  • 88.实现查看收藏功能的前端实现
  • 43道Java多线程高频题整理(附答案背诵版)
  • [蓝桥杯]解谜游戏
  • Tongweb配置跳过扫描应用jar的配置指引(by lqw)
  • 大模型如何革新用户价值、内容匹配与ROI预估
  • C语言字符数组初始化的5种方法(附带实例)
  • 鲲鹏麒麟服务器自制Nacos镜像并部署
  • Linux系统:ELF文件的定义与加载以及动静态链接
  • C++——红黑树
  • 三类 Telegram 账号的风控差异分析与使用建议
  • GWO-LSSVM-Adaboost灰狼算法GWO优化最小二乘支持向量机LSSVM分类预测!
  • python fbx sdk
  • 更新雅可比矩阵的非线性部分笔记
  • 和芯 SL6341 (内置FLASH) 国产USB 3.0HUB芯片 替代 GL3510 VL817
  • 区块链技术相关
  • mybatis中判断等于字符串的条件怎么写
  • ingress-nginx 开启 Prometheus 监控 + Grafana 查看指标
  • 《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)
  • Python爬虫实战:研究mechanize库相关技术
  • 深入解析JVM工作原理:从字节码到机器指令的全过程
  • 四叉树在空间结构建模中的应用
  • 车载以太网数据流量抓取手段全解析
  • 深度学习环境配置指南:基于Anaconda与PyCharm的全流程操作
  • C++11完美转发
  • Fullstack 面试复习笔记:Spring / Spring Boot / Spring Data / Security 整理
  • intelrealsense深度相机产品介绍
  • 从零开始的python学习(七)P95+P96+P97+P98+P99+P100+P101
  • MySQL安装与配置
  • (nice!!!)(LeetCode每日一题)2434. 使用机器人打印字典序最小的字符串(贪心+栈)