目录
一、局部变量与全局变量
局部变量
在函数内定义的变量就是局部变量,局部变量只能由该函数进行访问和修改,其他函数不能对其进行访问及修改。
全局变量
在函数外定义的变量叫外部变量,也叫全局变量,全局变量可以被本程序中所有函数所共同使用。定义全局变量如果不对其初始化则会自动初始化为0。当定义的全局变量与局部变量重名时,在函数内会屏蔽全局变量,只使用局部变量。
大量使用全局变量会是程序占用过多内存,全局变量从被定义开始直到程序退出才被释放。还会降低程序的可读性。
二、作用域
当变量被定义在程序的不同位置时,它的作用范围是不一样的,这个作用范围就是作用域。
代码块作用域
由一对大括号({ })包括的区域就是一个代码块,在代码块中定义的变量具有代码块作用域,其范围是从定义的位置开始到右大括号( } )处结束。即使不是在大括号内定义的也有代码块作用域。
例:
三个同名变量i定义在不同地方,分别打印不同地方的i的值。
文件作用域
任何在代码块之外声明的标识符(如全局变量、函数名等)都具有文件作用域。作用位置从声明处开始到文件结尾。
函数作用域
函数作用域只适用于goto语句的标签,作用将goto语句的标签限制在同一个函数内部,防止其他函数出现同名标签。
三、生存期
C语言的变量有两种生存期:静态存储期和自动存储期。
(1)具有文件作用域的变量和函数属于静态存储期,静态存储期的变量在程序运行期间一直占用存储空间,直到程序运行结束才释放空间。
(2)具有代码块作用域的变量一般属于自动存储期,自动存储期的变量在代码块结束时自动释放空间。
四、存储类型
(1)自动变量auto
在代码块中声明的变量默认的存储类型就是自动变量,用关键字auto来描述,如:
auto int i;
由于是默认存储类型,所以不加关键字auto也可以。
(2)寄存器变量register
# 变量声明为寄存器变量时,该变量有可能被存放到CPU寄存器中。
# 寄存器变量也具有代码块作用域。
# 当变量为寄存器变量时,无法通过取址运算符获取该变量地址。
(3)静态局部变量static
# 使用static声明的局部变量可以将该变量指定为静态局部变量;
# static使局部变量具有静态存储期,变量的生存期与全局变量一样,直到程序结束才释放。
(4)关键字extern
形如:
extern int a;
这里并不是定义变量a,而是声明使用的变量a在其它地方定义过了,两者使用的变量是同一个。