C语言进修教程第五章-函数(8)
变量的存储方法可分为“静态存储”和“动态存储”两种。
静态存储变量凡是是在变量界说时就分定存储单位并一直保持稳定, 直至整个措施竣事。5.5.1节中先容的全局变量即属于此类存储方法。动态存储变量是在措施执行进程中,利用它时才分派存储单位, 利用完毕当即释放。 典范的例子是函数的形式参数,在函数界说时并不给形参分派存储单位,只是在函数被挪用时,才予以分派, 挪用函数完毕当即释放。假如一个函数被多次挪用,则重复地分派、 释放形参变量的存储单位。从以上阐明可知, 静态存储变量是一直存在的, 而动态存储变量则时而存在时而消失。我们又把这种由于变量存储方法差异而发生的特性称变量的保留期。 保留期暗示了变量存在的时间。 保留期和浸染域是从时间和空间这两个差异的角度来描写变量的特性,这两者既有接洽,又有区别。 一个变量毕竟属于哪一种存储方法, 并不能仅从其浸染域来判定,还应有明晰的存储范例说明。
在C语言中,对变量的存储范例说明有以下四种:
auto 自动变量
register 寄存器变量
extern 外部变量
static 静态变量
自动变量和寄存器变量属于动态存储方法, 外部变量和静态变量属于静态存储方法。在先容了变量的存储范例之后, 可以知道对一个变量的说明不只应说明其数据范例,还应说明其存储范例。 因此变量说明的完整形式应为: 存储范例说明符 数据范例说明符 变量名,变量名…; 譬喻:
static int a,b; 说明a,b为静态范例变量
auto char c1,c2; 说明c1,c2为自动字符变量
static int a[5]={1,2,3,4,5}; 说明a为静整型数组
extern int x,y; 说明x,y为外部整型变量
下面别离先容以上四种存储范例:
一、自动变量的范例说明符为auto。
这种存储范例是C语言措施中利用最遍及的一种范例。C语言划定, 函数内凡未加存储范例说明的变量均视为自动变量, 也就是说自动变量可省去说明符auto。 在前面各章的措施中所界说的变量凡未加存储范例说明符的都是自动变量。譬喻:
{ int i,j,k;
char c;
……
}等价于: { auto int i,j,k;
auto char c;
……
}
自动变量具有以下特点:
1. 自动变量的浸染域仅限于界说该变量的个别内。在函数中界说的自动变量,只在该函数内有效。在复合语句中界说的自动变量只在该复合语句中有效。 譬喻:
int kv(int a)
{
auto int x,y;
{ auto char c;
} /*c的浸染域*/
……
} /*a,x,y的浸染域*/
2. 自动变量属于动态存储方法,只有在利用它,即界说该变量的函数被挪用时才给它分派存储单位,开始它的保留期。函数挪用竣事,释放存储单位,竣事保留期。因此函数挪用竣事之后,自动变量的值不能保存。在复合语句中界说的自动变量,在退出复合语句后也不能再利用,不然将引起错误。譬喻以下措施:
main()
{ auto int a,s,p;
printf("\ninput a number:\n");
scanf("%d",&a);
if(a>0){
s=a+a;
p=a*a;
}
printf("s=%d p=%d\n",s,p);
}
s,p是在复合语句内界说的自动变量,只能在该复合语句内有效。而措施的第9行却是退出复合语句之后用printf语句输出s,p的值,这显然会引起错误。
3. 由于自动变量的浸染域和保留期都范围于界说它的个别内( 函数或复合语句内), 因此差异的个别中答允利用同名的变量而不会夹杂。 纵然在函数内界说的自动变量也可与该函数内部的复合语句中界说的自动变量同名。例5.14表白了这种环境。
[例5.14]
main()
{
auto int a,s=100,p=100;
printf("\ninput a number:\n");
scanf("%d",&a);
if(a>0)
{
auto int s,p;
s=a+a;
p=a*a;
printf("s=%d p=%d\n",s,p);
}
printf("s=%d p=%d\n",s,p);
}
本措施在main函数中和复合语句内两次界说了变量s,p为自动变量。凭据C语言的划定,在复合语句内,应由复合语句中界说的s,p起浸染,故s的值应为a+ a,p的值为a*a。退出复合语句后的s,p 应为main所界说的s,p,其值在初始化时给定,均为100。从输出功效可以阐明出两个s和两个p虽变量名沟通, 但却是两个差异的变量。
4. 对结构范例的自动变量如数组等,不行作初始化赋值。
二、外部变量外部变量的范例说明符为extern。
在前面先容全局变量时已先容过外部变量。这里再增补说明外部变量的几个特点:
1. 外部变量和全局变量是对同一类变量的两种差异角度的提法。全局变是是从它的浸染域提出的,外部变量从它的存储方法提出的,暗示了它的保留期。
#p#分页标题#e#
2. 当一个源措施由若干个源文件构成时, 在一个源文件中界说的外部变量在其它的源文件中也有效。譬喻有一个源措施由源文件F1.C和F2.C构成: F1.C
int a,b; /*外部变量界说*/
char c; /*外部变量界说*/
main()
{
……
}
F2.C
extern int a,b; /*外部变量说明*/
extern char c; /*外部变量说明*/
func (int x,y)
{
……
}
在F1.C和F2.C两个文件中都要利用a,b,c三个变量。在F1.C文件中把a,b,c都界说为外部变量。在F2.C文件顶用extern把三个变量说明为外部变量,暗示这些变量已在其它文件中界说,并把这些变量的范例和变量名,编译系统不再为它们分派内存空间。 对结构范例的外部变量, 如数组等可以在说明时作初始化赋值,若不赋初值,则系统自动界说它们的初值为0。