局部变量,全局变量以及关键字static,extern
- 变量通常是在函数的开头进行定义,但不同位置定义,其有效范围不同,该范围也称为变量的作用域,根据作用域的不同,分为全局变量和局部变量
局部变量
- 定义变量时,若位于函数的开头(函数内部定义)或者函数内部的复合语句(程序块)内(for,if, while语句)定义,则这些变量称为局部变量。
- 在函数内部定义的变量其作用域为定义的位置到函数结尾
- 若在函数复合语句内定义,则作用域为复合语句内部(开头到结尾)
全局变量
-
一个源文件包含多个函数,在函数内部定义的变量称为局部变量,而函数外部定义的变量,则称为外部变量,也叫全局变量,约定俗成全局变量首字母一般大写或者使用
g_
开头 -
全局变量的作用域:(无extern修饰的情况下)从定义开始到本源文件结束,即仅当前源文件内定义的函数可以调用
- 优点:增加了函数间数据联系的渠道,间接传递数据,
- 缺点:非必要不使用全局变量
- 程序执行过程中,始终占用存储空间
- 代码函数间的通用性降低
- 降低了代码的清晰程度,随着调用含有全局变量的函数次数增多,全局变量的值不好判断;
-
说明:
- 在程序设计过程中,划分模块时,要求模块内部尽可能强内聚性,模块之间尽可能弱耦合性,即把功能单一的函数实现放在一个模块中,这样程序可移植性好,可读性强。
- 当同一个源文件中,出现全局变量和局部变量同名时,程序会报警告,但仍然可以编译运行,此时在局部变量的范围内,局部变量有效,全局变量的值会被屏蔽
变量的存储类型和生存周期
-
在C语言中,每个变量和函数均有两个属性:
- 数据类型:如int , float, char
- 存储类型: auto ,static, register , extern分别表示自动,静态,寄存器,外部的
-
变量的存储方式:主要是时间维度的侧重于变量的生存周期
- 程序区
- 静态存储区:如全局变量、静态局部变量(static)的存放
- 特点:程序运行开始分配内存,程序运行结束才会释放
- 针对静态局部变量,编译时便分配内存,只赋一次初值,若不初始化,对于数值型变量,系统默认初始化为0,字符型变量默认为’\0’,缺点是长时间占用内存。
- 动态存储区:自动变量,函数形参,函数调用的保护现场和返回地址
- 特点:函数调用开始分配内存,函数调用结束即可释放
- 自动变量未初始化时,其分配的值是不确定的;
-
变量的存储类型是变量在程序中空间维度的有效范围----作用域问题
- 全局变量的存储类型------extern
- 之前讨论全局变量的作用域一般是从源文件定义开始到本文件结束,但有时程序员想拓展其作用域即有效范围,该如何处理?这时就需要添加extern 关键字说明,
- 两种情况:
- 本文件的全局变量的扩展,若全局变量定义在源文件的中间,之前的代码想用此处定义的全局变量,第一种方式是移到文件开头,另一种方式就是使用extern 在所调用位置之前进行声明
- 扩展到其他文件使用:一个C程序项目包含多个源文件,若有两个文件都想要用到某一个全局外部变量,则做法是在任一个文件进行外部变量的定义,另一个文件中用extern 关键字进行声明
- 全局变量的限制关键字----static
- 文件开头使用static 修饰全局变量或函数时,希望仅本文件能够访问,其他文件禁止访问;
- 这样的函数或变量,称为静态外部变量或静态外部函数
- 全局变量的存储类型------extern
-
注意:
- 声明局部变量的存储类型和声明外部变量的存储类型是不同的
- 前者是为了确定变量的存储区域(属于静态存储还是动态存储)以及其生存周期的问题,后者是由于不管存储类型是什么,均属于静态存储,在编译阶段分配内存,声明其存储类型是考虑其作用域扩展的问题
-
参考地址:https://blog.csdn.net/jirryzhang/article/details/79518408