C语言中变量的作用域与存储类型

来源:互联网 发布:python语言就业前景 编辑:程序博客网 时间:2024/06/10 03:52

1.      全局变量与局部变量

任何函数或变量均只能定义一次,可声明多次。定义在代码块之内(函数块内)的变量为局部变量,定义在函数外部的变量为全局变量,作用范围是整个项目(不单单是本文件),因此也不能在其它文件中再次定义同名变量,函数也是如此。

2.      extern的用法

想使用其它源文件中定义的函数或全局变量,只需在本文件中添加声明语句即可。例如extern intvar_name;extern不是必需,但加上更规范。若在代码块内使用其它文件的全局变量,则必需用extern(不然变成了新建一个局部变量),且作用域是该代码块。

3.      static的用法

如果在定义函数或全局变量的时候用了static,则把函数或全局变量的作用域由整个项目限定为本文件,其它文件将无法使用该函数或变量。

4.      变量的存储位置

局部变量存储在内存堆栈,随着代码块的调用动态创建与释放;全局变量与函数均存储在静态内存中,在程序运行期间一直存在。若局部变量前用static声明,则存储位置由堆栈变为静态内存,但作用域仍然是局部的。全局变量前加上static的作用只是把作用域由整个项目限制为本文件,其它不变。

示例程序:

voidmain(){

fun();

fun();

}

voidfun(){

inta=10;

static int b =20;

a++;

b++;

printf("a=%db=%d\n",a,b);

}

运行结果为:

a=11 b=21

a=11 b=22

请按任意键继续. . .

5.      静态变量与自动变量

由上述程序可以看出,static变量的值是一直存在的,且定义并初始化的语句只在最初执行依次,之后再遇到将会忽略。另外,对于局部变量声明为static,因为作用域仍是局部,因此可在其它代码块内声明相同名字的static变量,两个局部的static变量都存储在静态内存且具有相同的变量名,但彼此没有关系。

6.      变量的初始化

a)      静态变量的初始化只进行一次,且是在可执行文件载入内存时已经确定;而自动变量(即堆栈变量)的初始化是在运行时确定。

b)     如果没有显示初始化,静态变量默认初始化为0,自动变量与寄存器变量的默认初始值是垃圾(即分配的地址上值是多少就默认初始化多少,因此不可用)。

c)      静态变量的初始化语句必须是字面值常量,因此在运气前就必须要确定初始值。自动变量的初始化语句可为任何表达式。

d)     int a =10 等价于int a; a=10; 只有风格之差,没有效率之别。

0 0