------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
一、局部变量、全局变量和存储分类
1.用户标识符的作用域
在C语言中用户标识符都有一个作用域,所谓的“作用域”是指程序中的某一部分,在这一部分中,该标识符
是有定义的,可以 被C编译和连接程序所识别的。
2.局部变量、全局变量和存储分类
全局变量:在函数外部定义的变量。(它是静态变量)
局部变量:在函数内部或复合语句内定义的变量。(它可以静态变量,也可以是自动 )
3.有两种存储类别:自动类和静态类。
有四个于存储类别有关的说明符:auto(自动)、register(寄存器)、static(静态)
二、局部变量及其作用域和生存期
1.auto变量
在函数内部或复合语句内定义变量时,如果没有指定存储类别,或使用了auto说明符,系统将默认该变量为自动类别
float a; 等价于: auto float a;
说明:(1)auto变量的存储单元被分配在内存的动态存储区,每当进入函数时(或复合语句)时,系统自动为auto变
量分配存储单元,
退出时自动释放这些存储单元另作他用。
(2)局部变量的定义必须放在所在函数体(或复合语句)中全部可执行语句之前
(3)所有自动类局部变量的生存期是调用所在函数(或复合语句)时都退出所在函数(或复合语句)
2.register变量
寄存器变量也是自动类变量,它与auto的区别:用register说明的变量建议编译程序将变量的值保存在CPU的寄存器中,
而不像一般变量那样,占内存单元。程序运行时,访问存于寄存器内的值要比访问存于内存中的值快得多。
例:
#include <stdio.h>
int power (int ,register int);
main( )
{ int s;
s = power(5,3);
printf("%d\n",s);
}
int power(int x,register int n) /* 函数power()用于计算X的N次方 */
{ register int n;
for(p = 1;n;n--)
p=p*x;
return p;
}
在power函数中,用作循环变量的n和存放连乘积的变量p被定义为register变量,以便加快求积速度。
说明:(1)CPU中寄存器的数目是有限的,因此只能说明少量的寄存器变量
(2)由于register变量的值是是放在寄存器内而不是放在内存中,所以register变量没有地址
(3)register变量的说明应尽量靠近其使用的地方,用完之后尽快释放,以便提高寄存器的使用效率
3.静态存储类的局部变量
局部变量用static来说明,作用域与auto、register类的变量一样,但有两点本质的区别:
(1)在整个程序运行期间,静态局部变量在内存的静态存储区中占有永久性的空间,即使退出函数后也
不释放。
(2)静态局部变量的初值是在编译时赋予的,不是在程序执行期间(自动变量是在程序执行期间),对
未赋初值的静态局部变量,C编译程序自动给它赋初值0
三、全局变量及其作用域和生存期
全局变量只有静态一种类别。对于全局变量可使用extern和static两种说明符
1.全局变量的作用域和生存期
全局变量的作用域是从变量定义的位置开始,到整个源文件结束为止。
例:
void fun1(void);
void funl2(void);
int sunm;
main( )
{ . . . sum++; . . . }
void fun1(void)
{ . . . sum++; . . . }
int test;
void funl2(void);
{ . . . sum++;test =1; . . . }
变量sum和test都是全局变量。sun它的作用域是整个程序(覆盖了三个函数),而test的作用域从定义开
始到程序结束(只覆盖了fun2函数)
说明:(1)全局变量的生存期是整个程序的运行期间
(2)若全局变量和某个函数中的局部变量同名,则在此函数中全局变量将被屏蔽
(3)全局变量在整个程序运行期间都占用内存空间
(4)全局变量必须在函数以外定义
注意:当全局变量定义在后引用它的函数在前,应该在引用它的函数中用extrn对此全局变量进行说明。
四、函数的存储分类
1.用extrn说明函数
若在函数定义时在函数返回类型前加上说明符extrn,则称此函数为外部函数(函数默认为外部函数)
外部函数的特征:可以被其他编译单位中的函数调用。
2.用static说明函数
若在函数定义时在函数返回类型前加上说明符static,则称此函数为静态函数
静态函数的特征:只限于本编译单位的其他函数调用它,而不允许其他编译单位中的函数对它进行调用。