每一个变量都有一个作用域问题,即它们在什么范围内有效。
文章目录
前言
定义变量有三种形式:
(1)在函数的开头定义;(局部变量)
(2)在函数内的复合语句定义;(局部变量)
(3)在函数的外部定义;(全局变量)
一、局部变量是什么?
局部变量在函数内部定义,且在本函数内部范围内有效。
- 主函数内定义的变量只在主函数内有效
- 不同函数内可使用同名变量
- 形式参数也是局部变量
- 一个函数中可以在复合语句内定义变量,但只在复合语句中有效,这种语句称为”程序块“
二、全局变量
在函数之外定义的变量,也叫全局变量,也叫外部变量,也叫全程变量
- 全局变量在整个程序范围内有效,可以为本文件内所有其它函数共用
- 有效范围从定义变量开始到本源文件结束
- 由于同一个文件中的所有函数都能引用全局变量的值,因此,在函数中改变了全局变量,就会影响到其它函数中全局变量的值,相当于各个函数之间有直接传递通道。
- 可以利用全局变量来增加函数之间的联系渠道,通过函数调用得到一个以上的值。
三、变量储存方式和生存周期
变量的值存在的时间,我们把它叫做生存期。
有的变量在程序运行的整个过程中都是存在的,有的是在需要用的时候才临时分配存储单元,而在函数调用结束后该程序就立马释放。
变量的储存方式分为动态储存方式和静态储存方式。
1. 动态储存方式和静态储存方式
储存空间有三部分:
- 程序区;
- 静态储存;
- 动态储存;
test.c——(编译)——————————(链接)——————test.exe可执行程序——执行->
全局变量(静态存储区) 局部变量(动态存储区)
静态储存方式:由系统自动分配好的存储单元(编译)
动态储存方式:在程序运行期根据需要进行动态的分配存储空间的方式
动态存储区又叫做栈区。
2.储存类别
C语言储存类别有4种:自动(auto),静态储存(static),寄存器的(register),外部的(extern)。
· 自动变量
在函数调用时,系统会给函数分配储存空间,在函数调用结束时,自动释放这些储存空间。
· 静态局部变量
函数调用结束后,不消失而继续保留原值,其被占用的储存单元不释放。在下一次被调用时,函数已经有值(就是上一次调用结束的值)
(1)静态局部变量属于静态存储区,在静态存储区内分配存储单元。
(2)对静态局部变量是在编译时赋初值的,即只赋值一次。以后每一次调用函数不在重新赋值,而是保留上一次函数调用结束时的值;而对自动变量赋初值,不是在编译时进行,而是在函数调用时进行的,每调用一次函数重新给一次初值,相当于执行一次赋值语句。
(3)如果在定义局部变量不赋初值,则对静态局部变量来说编译器自动赋初值为0(对数值型变量)或空字符’\0‘(对字符变量);对自动变量来说,它的值是一个不确定的值,由于每次函数调用结束后存储单元已释放,而下次调用需重新分配,所分配单元是不可知的。
(4)虽然静态局部变量被调用后值仍然存在,但是其它函数不能引用它,只能在作用域范围内被引用。
但是,用静态存储需要多占内存(长期占用内存不释放,而不能像动态存储那样,一个内存空间可先后被多个变量使用,节约内存),静态就降低了内存利用率,可读性不强,若非必要,不使用静态局部变量。
· 寄存器变量
把大量重复的变量放在寄存器中,寄存器在CPU中,能大大提高代码执行效率。
不过随着技术发达,计算机速度越来越高,优化系统能自动将这些变量放在寄存器中,不需要程序设计指定。
3.全局变量的储存类别
全局变量存储在静态区,它们的生存期是固定的,存在于程序的整个运行周期。
(1)对局部变量static的声明,把他分配在静态存储区内,该变量在整个程序执行期间不释放,其分配的空间始终存在。
(2)对全局变量static的声明,该变量的作用域受到限制,只限于本文件模块使用
总结
局部变量与全局变量同名,优先使用局部变量
标签:储存,变量,静态,局部变量,生存期,全局变量,函数 From: https://blog.csdn.net/2401_88850882/article/details/144194585