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. 外部变量和全局变量是对统一类变量的两种分歧角度的提法。全局变是是从它的劝化域提出的,外部变量从它的存储体例提出的,表示了它的保存期。

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。




版权声明: 原创作品,应许转载,转载时请务必以超链接体例标明文章 原始起因 、作者信息和本声明。不然将穷究执法责任。

原文地址:https://www.cnblogs.com/zgqjymx/p/1975597.html