参考资料:高教版《全国计算机等级考试二级教程——C语言程序设计》、《21天学通C语言》
局部变量、全局变量和存储分类
用户标识符的作用域
所谓标识符的“作用域”就是指程序中的某一部分,在这一部分中,该标识符是有定义的,可以被C编译和连接程序所识别,也就是说,指的是程序中的哪些部分可以访问变量。
作用域还会影响变量的生存期,也就是变量在内存中存活的时间,或者说何时分配和释放变量占用的内存空间。
局部变量、全局变量和存储分类
在函数内部或复合语句内部定义的变量,称为局部变量。函数的形参也属于局部变量。
在函数外部定义的变量,称为全局变量。
有时,局部变量也被称为内部变量,全局变量也被称为外部变量。
C语言中,有两种存储类别:自动类和静态类。全局变量只能是静态类,而局部变量既可以是静态类也可以是自动类。
局部变量及其作用域和生存期
auto变量
当在函数内部或复合语句内定义变量时,如果没有指定存储类,或者使用了auto说明符,系统就认为所定义的变量具有自动类别。
在函数内部或复合语句内,以下两条语句是等价的:
float a;
auto float a;
auto变量的存储单元被分配在内存的动态存储区。这类局部变量的作用域是从定义的位置起到函数体(或复合语句)结束为止。
register变量
寄存器变量也是自动类变量,它与auto类的区别仅在于:用register说明的变量建议编译程序将变量的值保留在CPU的寄存器中,而不是占内存单元。
当程序对运行速度有较高要求时,把那些频繁引用的少数变量指定为register变量,有助于提高程序的运行速度。
例1 以下函数用power()计算x^n
#include <stdio.h>
int power(int, register int);
int main(void)
{
int s;
s = power(5, 3);
printf("%d\n", s);
return 0;
}
int power(int x, register int n)
{
register int p;
for(p = 1; n; n--)
p = p * x;
return p;
}
在power()函数中,用作循环变量的n和存放连乘积的变量p被定义为register变量,以加快求职速度。
注意:
- 只能说明少量的寄存器变量。
- register变量没有地址(因为不是放在内存中的)。
静态存储类的局部变量(static变量)
当在函数体或复合语句中用static来说明一个变量时,可以称该变量为静态局部变量。
静态局部变量与前两种变量有以下区别:
- 整个程序运行期间,静态局部变量在内存的静态存储区中占据着永久性的存储单元。所以,静态局部变量的生存期将一直延长到程序结束。
- 静态局部变量的值是在编译时赋予的,而不像自动变量是在程序执行过程中赋值。对于没有赋初值的静态局部变量,C编译程序给其自动赋初值0。
全局变量及其作用域和生存期
全局变量只有静态一种类别。对于全局变量可以使用extern和static两种说明符。
全局变量的作用域和生存期
全局变量的在函数外部任意位置上定义的变量。它的作用域是从变量定义的位置开始,到整个源文件结束为止。
全局变量的生存期是整个程序运行期间。
注意:若全局变量和某个局部变量同名,则在该函数中,访问的是局部变量,与同名的全局变量不发生任何关系。
例2 同名的局部变量与全局变量
#include <stdio.h>
int sum; //定义全局变量
void fun(void);
int main(void)
{
sum = 10;
printf("* * main(1) * *:%d\n", sum);
fun();
printf("* * main(2) * *:%d\n", sum);
return 0;
}
void fun(void)
{
int sum; //定义同名局部变量
sum = 20;
printf("* * fun * *:%d\n", sum);
}
输出:
* * main(1) * *:10
* * fun * *:20
* * main(2) * *:10
注意:除十分必要外,一般不提倡使用全局变量。
在同一编译单位内用extern说明符扩展全局变量的作用域
当全局变量定义在后,引用它的函数在前时,应该在引用它的函数中用extern对此全局变量进行说明。这时其作用域从extern说明处起,延伸到该函数的末尾。函数使用全局变量时,最好在函数内使用extern关键字声明该变量。
静态全局变量
当用static说明符说明全局变量时,此变量可称作“静态”全局变量。静态全局变量仅局限于本编译单位使用,不能被其他编译单位所引用。
函数的存储分类
所有函数都是外部的,因为不允许在函数内部定义另一个函数。
但当定义函数时,可以使用extern或static说明符。
用extern说明函数
当定义一个函数时,若在函数返回值的类型前加上说明符extern,则称此函数为“外部”函数。
注:extern说明符可以省略,一般的函数都隐含说明为extern。
外部函数可以被其他编译单位中的函数调用。通常,当函数调用语句与被调用函数不在同一编译单位,且函数的返回值为非整数时,应该在调用语句所在的函数的说明部分用extern对所调用的函数进行函数说明。
用static说明函数
当定义一个函数时,若在函数返回值的类型钱加上说明符static,则称此函数为“静态”函数。
静态函数只限于本编译单位的其他函数调用它,而不允许其他编译单位中的函数对它进行调用。所以,静态函数又可称作“内部”函数。
网友评论