一、先搞一波概念
变量按作用域分:
1.局部变量:
(1)在函数的开头定义(如定义形参)。
(2)在函数内部定义(如在函数里面定义的变量)。
(3)在函数内部的复合语句定义(如for循环,花括号内)。
前两种方式定义的变量可以在函数内任何地方使用,而第三种方式定义的变量只能在复合语句内使用。
说明:
(1)不同函数\同一函数不同复合语句,可以使用同名变量,它们表示不同对象,互不干扰。
2.全局变量
在函数之外定义的变量称为全局变量,也称为外部变量,其作用域为从定义变量的位置开始到本源文件结束。
说明:
(1)因为函数只能返回一个返回值,因此可以通过使用全局变量来实现一个函数改变多个值后,还能被其他函数调用。
(2)全局变量在程序执行整个过程中都占用存储单元,使用太多全局变量所以占用空间比较大。
(3)局部变量会屏蔽同名的全局变量,即局部变量优先。
按变量的存储方式来分:
3.动态存储方式
程序运行期间根据需要进行动态分配存储空间方式。
说明:
(1)函数结束时自动释放存储空间。
(2)同一个动态变量被执行两次,其存储空间的地址不一定相同,因为其第一次调用完后会释放地址,第二次调用不一定还是分配第一次调用的地址,所以导致动态变量在定义时不初始化,
其值为随机数(不能确保分配的地址上存了什么数)。
4.静态存储方式
程序运行期间由系统分配固定的存储空间的方式。
说明:
(1)在程序执行整个过程中都占用存储单元,如果静态变量在定义时不初始化,其值都为0或“\0”。
5.变量存储类别
在c语言中,每一个变量和函数都是有两个属性:数据类型和数据的存储类别。c语言中分为四种类别:自动的(auto)、静态的(static)、寄存器的(register)、外部的(extern),自动变量存放在动态存储区,静态变量和外部变量存放在静态存储区中,寄存器变量存放在CPU的寄存器中。如果在定义或者声明时没有指定,系统会采取默认方式。
重点来了:
1.局部变量与存储类别的关系
(1)自动变量(格式:auto 变量):
在局部变量中,只要不指定其为静态存储类别(static),都是以动态分配存储空间,所以当定义一个自动变量时,可以省略(auto),如形参等,在程序中推荐使用,也是使用最多的一个变量
(2)静态局部变量(格式:static):
使用关键字static来定义,在函数调用完不释放空间,在下次调用时,还保留上一次的值。一般使用它比较有技巧,比如计算n!,可以循环调用一个函数实现累乘,把结果存放在一个静态局部变量中(这个变量可以在被调函数中,这可以放在主调函数中,当然还可以把它换成全局变量,效果都一样)。
说明:
(1)静态局部变量只在编译时赋值,即只在编译时执行“static int a = 1 ” 这句代码一次,无论运行期间调用这句代码所在的函数多少次,前提是必须在定义的同时赋值;而自动局部变量,没调用一次就执行定义赋值一次。
如下代码:
(2)使用静态存储要多占内存,降低程序可读性,不要过多使用。
(3)局部变量无声明(extern)
2.全局变量与存储类别的关系
(1)所有全局变量都是静态变量,都存在静态存储区。
(2)所有外部变量不加static修饰,都可以使用关键字extern来声明(格式为 extern(int可省略类型) a;),可以扩张其作用域从声明处开始,还可以跨源文件声明使用。
(3)在外部变量前面加static修饰符,可将外部变量限制在本文件中。这里有一个坑,如果变量为static全局变量,在函数内不能扩张其作用域,必须在函数外声明以达扩张效果(包括主函数)。
(4)外部变量和局部变量都只能定义一次,但外部变量可以声明多次,而局部变量不能有声明。
(5)所谓变量的声明,只是把作用域扩张到声明处以下,仅仅而已,而且只有这一种声明方法。
这篇文章只总结变量的声明和定义吧,函数的放到这里总结吧,这样显得没那么乱!