C 作用域规则
作用域是程序中定义变量所存在区域,超过该区域变量就不能访问。三个地方可声明变量:
- 函数或块内部的局部变量
- 所有函数外部的全局变量
- 形式参数的函数参数定义中
局部变量
函数或块的内部声明的变量称为局部变量。只能被该函数或该代码块内部语句使用,函数外部不可知。
eg:
#include <stdio.h>
int main ()
{
/* 局部变量声明 */
int a, b;
int c;
/* 实际初始化 */
a = 10;
b = 20;
c = a + b;
printf ("value of a = %d, b = %d and c = %d\n", a, b, c);
return 0;
}
变量 a、b 和 c 是 main() 函数的局部变量。
全局变量
定义在函数外部,在程序的顶部。全局变量在整个程序内都有效,函数内部能访问全局变量。
可被任何函数访问,声明后,全局变量整个程序中都可用。
eg:
#include <stdio.h>
/* 全局变量声明 */
int g;
int main ()
{
/* 局部变量声明 */
int a, b;
/* 实际初始化 */
a = 10;
b = 20;
g = a + b;
printf ("value of a = %d, b = %d and g = %d\n", a, b, g);
return 0;
}
局部变量和全局变量的名称可相同,函数内,名字相同,使用局部变量值,全局变量不使用。
eg:
#include <stdio.h>
/* 全局变量声明 */
int g = 20;
int main ()
{
/* 局部变量声明 */
int g = 10;
printf ("value of g = %d\n", g);
return 0;
}
value of g = 10
形式参数
函数的参数、形式参数被当作该函数内的局部变量,与全局变量同会被优先使用。
eg:
#include <stdio.h>
/* 全局变量声明 */
int a = 20;
int main ()
{
/* 在主函数中的局部变量声明 */
int a = 10;
int b = 20;
int c = 0;
int sum(int, int);
printf ("value of a in main() = %d\n", a);
c = sum( a, b);
printf ("value of c in main() = %d\n", c);
return 0;
}
/* 添加两个整数的函数 */
int sum(int a, int b)
{
printf ("value of a in sum() = %d\n", a);
printf ("value of b in sum() = %d\n", b);
return a + b;
}
value of a in main() = 10 value of a in sum() = 10 value of b in sum() = 20 value of c in main() = 30
全局变量与局部变量内存中的区别:
- 全局变量保存在内存全局存储区,占静态存储单元;
- 局部变量保存在栈,在所在函数被调用时,动态地为变量分配存储单元。
初始化局部变量和全局变量
局部变量被定义时,系统不会对其初始化,必须自行对其初始化。定义全局变量时,系统会自动对其初始化。
数据类型 | 初始化默认值 |
---|---|
int | 0 |
char | '\0' |
float | 0 |
double | 0 |
pointer | NULL |
未初始化的变量会导致一些在内存位置中已经可用的垃圾值。