C语言学习-第七章 利用函数实现模块化程序设计⑤

110 阅读3分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第21天,点击查看活动详情

局部变量和全局变量

问题:在一个函数中定义的变量,在其他函数中能否被引用?在不同位置定义的变量,在什么范围内有效?

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

局部变量

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

  • 在函数的开头定义:在函数内定义的变量只在本函数范围内有效
  • 在函数内的复合语句内定义:只能在本复合语句内才能引用它们
  • 在函数的外部定义

全局变量

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

建议不在必要时不要使用全局变量,原因如下:

  • 全局变量在程序的全部执行过程中都占用存储单元,而不是仅在需要时才开辟单元
  • 它使函数的通用性降低了,程序设计中,在划分模块时要求模块的“内聚性”强,与其他模块的“耦合性”弱
  • 使用全局变量过多,会降低程序的清晰性

注意:如果在同一个源文件中,全局变量与局部变量同名:在局部变量的作用范围内,局部变量有效,全局变量被“屏蔽”,即它不起作用

变量的存储方式和生存期

动态存储方式与静态存储方式

从上面可以了解到,从变量的作用域角度来观察,变量可以分为全局变量局部变量

还可以从变量值存在的时间(即生存期)来观察。变量的存储有两种不同的方式:静态存储方式动态存储方式

  • 静态存储方式:是指在程序运行期间由系统分配固定的存储空间的方式
  • 动态存储方式:是在程序运行期间根据需要进行动态的分配存储空间的方式

内存中供用户使用的存储空间的情况可以分为3部分:数据分别存放在静态存储区和动态存储区中。

  • 程序区
  • 静态存储区:全局变量全部存放在静态存储区中,在程序开始执行时给全局变量分配存储区,程序执行完毕释放。在程序执行过程中它们占据固定的存储单元,而不是动态地进行分配和释放。
  • 动态存储区:动态存储区中可以存放以下数据,在函数调用开始时分配动态存储空间,函数结束时释放这些空间。
    • 函数形式参数:在调用函数时给形参分配存储空间
    • 函数中定义的没有用关键字static声明的变量
    • 函数调用时的现场保护和返回地址

每一个变量和函数都有两个数学:数据类型数据的存储类别

  • 数据类型:整型、浮点型这种
  • 存储类别:指的是数据在内存中存储的方式(如静态存储和动态存储)

C的存储类别包括4种:自动的(auto)、静态的(statis)、寄存器的(register)、外部的(extern)


  • 为什么要用函数
  • 怎样定义函数
  • 调用函数
  • 对被调用函数的声明和函数原型
  • 函数的嵌套调用
  • 函数的递归调用
  • 数组作为函数参数
  • 局部变量和全局变量
  • 变量的存储方式和生存期
  • 关于变量的声明和定义
  • 内部函数和外部函数