局部变量,全局变量以及关键字static,extern

10 篇文章 0 订阅

局部变量,全局变量以及关键字static,extern

  • 变量通常是在函数的开头进行定义,但不同位置定义,其有效范围不同,该范围也称为变量的作用域,根据作用域的不同,分为全局变量和局部变量
局部变量
  • 定义变量时,若位于函数的开头(函数内部定义)或者函数内部的复合语句(程序块)内(for,if, while语句)定义,则这些变量称为局部变量。
    • 在函数内部定义的变量其作用域为定义的位置到函数结尾
    • 若在函数复合语句内定义,则作用域为复合语句内部(开头到结尾)
全局变量
  • 一个源文件包含多个函数,在函数内部定义的变量称为局部变量,而函数外部定义的变量,则称为外部变量,也叫全局变量,约定俗成全局变量首字母一般大写或者使用g_开头

  • 全局变量的作用域:(无extern修饰的情况下)从定义开始到本源文件结束,即仅当前源文件内定义的函数可以调用

    • 优点:增加了函数间数据联系的渠道,间接传递数据,
    • 缺点:非必要不使用全局变量
      • 程序执行过程中,始终占用存储空间
      • 代码函数间的通用性降低
      • 降低了代码的清晰程度,随着调用含有全局变量的函数次数增多,全局变量的值不好判断;
  • 说明

    • 在程序设计过程中,划分模块时,要求模块内部尽可能强内聚性,模块之间尽可能弱耦合性,即把功能单一的函数实现放在一个模块中,这样程序可移植性好,可读性强。
    • 当同一个源文件中,出现全局变量和局部变量同名时,程序会报警告,但仍然可以编译运行,此时在局部变量的范围内,局部变量有效,全局变量的值会被屏蔽

变量的存储类型和生存周期

  • 在C语言中,每个变量和函数均有两个属性:

    • 数据类型:如int , float, char
    • 存储类型: autostaticregisterextern分别表示自动,静态,寄存器,外部的
  • 变量的存储方式:主要是时间维度的侧重于变量的生存周期

    • 程序区
    • 静态存储区:如全局变量、静态局部变量(static)的存放
      • 特点:程序运行开始分配内存,程序运行结束才会释放
      • 针对静态局部变量,编译时便分配内存,只赋一次初值,若不初始化,对于数值型变量,系统默认初始化为0,字符型变量默认为’\0’,缺点是长时间占用内存。
    • 动态存储区:自动变量,函数形参,函数调用的保护现场和返回地址
      • 特点:函数调用开始分配内存,函数调用结束即可释放
      • 自动变量未初始化时,其分配的值是不确定的
  • 变量的存储类型是变量在程序中空间维度的有效范围----作用域问题

    • 全局变量的存储类型------extern
      • 之前讨论全局变量的作用域一般是从源文件定义开始到本文件结束,但有时程序员想拓展其作用域即有效范围,该如何处理?这时就需要添加extern 关键字说明,
      • 两种情况:
        • 本文件的全局变量的扩展,若全局变量定义在源文件的中间,之前的代码想用此处定义的全局变量,第一种方式是移到文件开头,另一种方式就是使用extern 在所调用位置之前进行声明
        • 扩展到其他文件使用:一个C程序项目包含多个源文件,若有两个文件都想要用到某一个全局外部变量,则做法是在任一个文件进行外部变量的定义,另一个文件中用extern 关键字进行声明
    • 全局变量的限制关键字----static
      • 文件开头使用static 修饰全局变量或函数时,希望仅本文件能够访问,其他文件禁止访问;
      • 这样的函数或变量,称为静态外部变量静态外部函数
  • 注意

    • 声明局部变量的存储类型和声明外部变量的存储类型是不同的
    • 前者是为了确定变量的存储区域(属于静态存储还是动态存储)以及其生存周期的问题,后者是由于不管存储类型是什么,均属于静态存储,在编译阶段分配内存,声明其存储类型是考虑其作用域扩展的问题
  • 参考地址:https://blog.csdn.net/jirryzhang/article/details/79518408

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值