作用域是程序的一个区域,一般来说有三个地方可以定义变量:
- 局部变量:在函数或一个代码块内部声明的变量。
- 形式参数:在函数参数的定义中声明的变量。
- 全局变量:在所有函数外部声明的变量。
局部变量
在函数或一个代码块内部声明的变量,称为局部变量。它们只能被函数内部或者代码块内部的语句使用。
实例:
1 |
|
全局变量
在所有函数外部定义的变量(通常是在程序的头部),称为全局变量。全局变量的值在程序的整个生命周期内都是有效的。
全局变量可以被任何函数访问。也就是说,全局变量一旦声明,在整个程序中都是可用的。
实例:
1 |
|
在程序中,局部变量和全局变量的名称可以相同,但是在函数内,局部变量的值会覆盖全局变量的值。
在函数内的局部变量与全局变量是两个独立的变量,互不影响。全局变量的值可以在局部函数内重新赋值。
实例:
1 |
|
结果:10
若要想让 main
函数也使用全局变量 a,可以用 extern
对全局变量进行声明,就可以合法使用了。
1 |
|
初始化局部变量和全局变量
当局部变量被定义时,系统不会对其初始化,必须自行对其初始化。
定义全局变量时,系统会自动初始化为下列值:
1 | // 数据类型 初始化默认值 |
字符0
和\0
及整数0
的区别
字符型变量用于存储一个单一字符,在 C 语言中用 char
表示,其中每个字符变量都会占用 1 个字节(8 位二进制数)。
整型 int 在内存中占用空间为四个字节(32位二进制数)。
字符 0
:char c = '0'
; 它的 ASCII 码实际上是 48,内存中存放表示:00110000
。
字符 \0
: ASCII 码为 0,表示一个字符串结束的标志。这是转义字符(整体视为一个字符)。由于内存中存储字符,依然是存储的是对应字符集的字符编码,在内存中的表现形式为 00000000
。
整数 0
: 内存中表示为 00000000 00000000 00000000 00000000
,虽然都是 0,但是跟上面字符 \0
存储占用长度是不一样的。
静态变量
存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化。
共有两种变量存储在静态存储区:全局变量
和 static
变量,只不过和全局变量比起来,static
可以控制变量的可见范围,即 static
是用来隐藏的。虽然这种用法不常见。
PS:如果作为 static
局部变量在函数内定义,它的生存期为整个源程序,但是其作用域仍与自动变量相同,只能在定义该变量的函数内使用该变量。退出该函数后, 尽管该变量还继续存在,但不能使用它。
1 |
|