第19讲 全变量及其作用域和生存期 函数的存储分类ppt教学课件
作用域与存储类型PPT课件
#include<> //不能省略 static int n; // 定义静态全局变量n void fn( ) { n=n+1; printf(“%d\n”,n); }
5.2 变量的存储类别
4、外部类型(extern) 定义格式: extern 类型 变量名;
在由多个源程序文件组成的程序中,如果一个文件要 使用另一个文件中定义的全局变量,这些源程序文件之间 通过外部类型的变量进行沟通。
注意: (1)#define、宏名和字符 串之间一定要有空格。 (2)宏名一般用大写字母表 示,以区别于普通标识符。 (3)宏被定义以后,一般不 能再重新定义。但可以用 #undef来终止宏定义。 (4)一个定义过的宏名可以 用来定义其他新的宏,但要 注意其中的括号。如:
#define A 20
#define B (A+10)
void main()
{
int a,b;
//a、b具有函数作用域
cout<<"输入两整数:"<<endl;
cin>>a>>b;
cout<<“a="<<a<<'\t'<<"b="<<b<<endl;
if(b>=a)
{
int t;
// t具有块作用域
t=a; a=b; b=t; //交换a,b的值
}
cout<<"a="<<a<<'\t'<<"b="<<b<<endl; // t已经无效
生存周期与作用域
3.静态存储方式
ห้องสมุดไป่ตู้
4.在一个项目里的各个源文件中都是有效的
静态全局变量:
1.需要用static声明
2.同全局变量,但在程序编辑阶段分配内存空间
3.静态存储方式
4.只在它声明的源文件中是有效的
static生命周期
静态变量的类型说明符是static。静态变量当然是属于静态存储方式,但是属于静态存储方式的量不一定就是静态变量,例如外部变量虽属于静态存储方式,但不一定是静态变量,必须由 static加以定义后才能成为静态外部变量,或称静态全局变量。对于自动变量,它属于动态存储方式。但是也可以用static定义它为静态自动变量,或称静态局部变量,从而成为静态存储方式。由此看来,一个变量可由static进行再说明,并改变其原有的存储方式。
2.静态全局变量
全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式。这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。而静态全局变量则限制了其作用域,即只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。
1. 静态局部变量
在局部变量的说明前再加上static说明符就构成静态局部变量。例如:
static int a,b; static float array[5]={1,2,3,4,5};
静态局部变量属于静态存储方式,它具有以下特点:
变量的作用域和生存期
变量的作用域局部变量和全局变量在函数和复合语句内定义的变量,只在本函数或复合语句范围内有效(从定义点开始到函数或复合语句结束),他们称为内部变量或局部变量。
在函数之外定义的变量是外部变量,也称为全局变量(或全程变量)。
如果在一个函数中全局变量和局部变量同名,则在局部变量的作用范围内,外部变量被“屏蔽”,即他不起作用,此时局部变量是有效的。
全局变量的作用是增加函数间数据联系的渠道。
虽然全局变量有以上优点,但建议不必要时不要使用全局变量,因为全局变量在程序的全部执行过程中都占用存储单元,而不是仅在需要时才开辟单元。
在程序设计时,对模块的划分要求:内聚性强,与其他模块的耦合性弱,这样便于程序的移植,可读性强。
变量的生存期变量的存储方式分为两种:静态存储方式和动态存储方式。
静态存储方式是指在程序与性能期间由系统在静态存储区分配存储空间的方式,在程序运行器件不释放;而动态存储方式则是在函数调用期间根据需要在动态存储区分配存储空间的方式。
这就是变量的存储区别。
Auto----声明自动变量函数中的形参和在函数中定义的变量都属于此类。
在调用这些函数时,系统给这些变量分配存储空间,函数调用结束时就自动释放这些存储空间。
因为这类局部变量称为自动变量(auto 变量)。
关键字auto作为存储类别的声明。
Auto可省略Static-----声明静态变量希望函数中的变量的局部变量的值在函数调用结束后不消失而继续保留原值,即其占用的存储单元不释放,在下一次该函数调用时,该变量已有值,就是上一次函数调用结束时的值。
这时就用关键字static指定该局部变量为“静态存储变量”。
对静态局部变量的说明静态局部变量属于静态存储类别,在静态存储区内分配存储单元,在程序整个运行期间都不释放。
而自动变量(即动态局部变量)属于动态存储类别,占胴体啊存储区空间而不占静态存储区空间,函数调用结束后即释放。
对静态局部变量是在编译时赋初值的,即只赋初值一次,在以后每次调用函数时不再重新赋初值而只是保留上次函数调用结束时的值。
生存空间和生命周期以及多载化函式课件
生存空間和生命週期以及多載化函
2024/7/31
式
16
編譯器對同名函式的解讀-4
如果兩個函式的參數列只有預設引數不 同,那麼第二個函式會被視為第一個函式 的重複宣告.
例如:
//宣告相同的函式
int max(int*,int);
int max(int*,int=10);
範例程式: OverLoadDemo.cpp
以下是危險的做法:
int* trouble() {
int res; ………. return &res; //危險的,因為res的記憶體已經被釋放了. }
生存空間和生命週期以及多載化函
2024/7/31
式
8
Register Automatic Objects
對於使用量極重的automatic objects,可 以用關鍵字register修飾他們.
式
25
練習題解答參考
敘述句練習題範例程式: Lesson3HomeWork.cpp
函式練習題範例程式: Lesson4HomeWork.cpp
生存空間和生命週期以及多載化函
2024/7/31
式
26
生命週期同global object(整個程式期間) object可見度受限於local scope. 初值初始化動作僅做第一次. 範例程式: LocalObjectDemo.cpp 如果宣告時沒有給定初值,則內定初值為
0. 驗證程式: LocalObjectInit.cpp
生存空間和生命週期以及多載化函
2024/7/31
式
10
動態配置的物件
使用指標和 new , delete 算式.
程式不會自動釋放利用new配置的記憶 體,程式設計師必須自行用delete釋放.
变量与函数课件
变量与函数课件变量与函数课件在计算机科学领域中,变量和函数是两个基本概念,它们在编程语言中起着重要的作用。
变量用于存储数据,而函数则用于执行特定的任务。
本文将探讨变量和函数的概念、用法以及它们在实际编程中的应用。
一、变量的概念与用法变量是计算机程序中存储数据的一种方式。
它们可以存储各种类型的数据,如整数、浮点数、字符串等。
在编程中,我们可以通过给变量赋值来存储数据,并在后续的代码中使用这些数据。
例如,在Python编程语言中,我们可以通过以下方式定义一个整数变量:num = 10在这个例子中,我们定义了一个名为"num"的变量,并将其赋值为10。
现在,我们可以在后续的代码中使用这个变量来进行计算或输出。
除了整数,变量还可以存储其他类型的数据。
例如,我们可以定义一个字符串变量:name = "John"在这个例子中,我们定义了一个名为"name"的变量,并将其赋值为"John"。
现在,我们可以在后续的代码中使用这个变量来进行字符串操作。
变量不仅可以存储数据,还可以进行一些基本的操作,比如加法、减法、乘法和除法。
例如,我们可以定义两个整数变量并进行加法操作:num1 = 5num2 = 3sum = num1 + num2在这个例子中,我们定义了两个整数变量"num1"和"num2",并将它们的和赋值给"sum"变量。
现在,"sum"变量的值为8,我们可以在后续的代码中使用它。
二、函数的概念与用法函数是一段可重用的代码块,用于执行特定的任务。
它们接受输入参数,并返回输出结果。
在编程中,函数可以帮助我们组织代码,并提高代码的重用性和可读性。
在许多编程语言中,函数的定义通常包括函数名、参数列表和函数体。
例如,在Python中,我们可以定义一个简单的函数来计算两个数的和:def add(num1, num2):sum = num1 + num2return sum在这个例子中,我们定义了一个名为"add"的函数,它接受两个参数"num1"和"num2"。
C语言入门教程:变量的作用域和生存期
C语言入门教程:变量的作用域和生存期.txt你妈生你的时候是不是把人给扔了把胎盘养大?别把虾米不当海鲜。
别把虾米不当海鲜。
作用域和生存期C程序的标识符作用域有三种:局部、全局、文件。
标识符的作用域决定了程序中的哪些语句可以使用它,换句话说,就是标识符在程序其他部分的可见性。
通常,标识符的作用域都是通过它在程序中的位置隐式说明的。
1.局部作用域前面各个例子中的变量都是局部作用域,他们都是声明在函数内部,无法被其他函数的代码所访问。
函数的形式参数的作用域也是局部的,它们的作用范围仅限于函数内部所用的语句块。
void add(int);main(){int num=5;add(num);printf(%d\n,num); /*输出5*/}void add(int num){num++;printf(%d\n,num); /*输出6*/}上面例子里的两个num变量都是局部变量,只在本身函数里可见。
前面我们说了,在两个函数出现同名的变量不会互相干扰,就是这个道理。
所以上面的两个输出,在主函数里仍然是5,在add()函数里输出是6。
2.全局作用域对于具有全局作用域的变量,我们可以在程序的任何位置访问它们。
当一个变量是在所有函数的外部声明,也就是在程序的开头声明,那么这个变量就是全局变量。
void add(int);int num;main(){int n=5;add(n);printf(%d\n,num); /*输出6*/}void add(num) /*形式参数没有指定类型*/{num++;printf(%d\n,num); /*输出6*/}上面的main()和add()里面,并没有声明num,但是在最后输出的时候却要求输出num,这是由于在程序的开始声明了num是全局变量,也就是在所有函数里都可以使用这个变量。
这时候一个函数里改变了变量的值,其他函数里的值也会出现影响。
上面的例子输出都是6,因为在add()函数里改变了num的值,由于num是全局变量,就好象它们两个函数共用一个变量,所以在main()函数里的num也随之改变了。
2020—2021学年人教版数学八年级下册19.1变量与函数课件
4.油箱中有油30kg,油从管道中匀速流出,1h流完,则
油箱中剩余油量Q(kg)与流出时间t(min)之间的函 数关系式是 Q 30 12,t 自变量t的取值范围
是 0 t . 60
5.我市白天乘坐出租车收费标准如下:乘坐里程不 超过3公里,一律收费8元;超过3公里时,超过3公 里的部分,每公里加收1.8元;设乘坐出租车的里程 为x(公里)(x为整数),相对应的收费为y(元).
少,平均耗油量为0.1L/km。你能帮小明解决以下问题 吗?
(1)写出表示y与x的函数关系的式子。
(2)指出自变量x的取值范围。
(3)汽车行驶200 km时,油箱中还有多少油?
(1)写出表示y与x的函数关系的式子.
解:(1) 函数关系式为:
叫做函数的解析式
y = 50-0.1x
0.1x表示的意义是什么?
(1)y=2x
x为任何实数
(2)m n 1
(3)y 3 x2
(4)h 1 k k 1
(5)y=(x-3)º
n≥1 x≠中自变量的取值范围时,主要看等式右边的代 数式,如果等式右边
(1)是整式:自变量取值范围为:任意实数; (2)是分式:自变量取值范围为:分母不为0的所有实 数;
(3)含算术平方根:自变量的取值范围为:被开方数 ≥0的所有实数; (4)既含分式又含算术平方根:自变量取值范围为: 分母不为0且被开方数≥0的所有实数; (5)函数关系式含0指数:底数≠0
国庆期间,小明家里买了一辆小汽车,小明发现 油箱中现有汽油50L,如果不再加油,那么油箱中的油
量y(单位:L)随行驶里程x(单位:km)的增加而减
变量的生存期和作用域
变量的⽣存期和作⽤域变量的⽣存期和作⽤域是个很基础但⼜很重要的问题,所以我打算写⼏百字重温⼀下。
变量的⽣存期是指变量在什么时间段存在。
变量的作⽤域是指变量在哪些代码块中能够被访问。
⼀般来说变量⽣存期包含作⽤域。
即在变量起作⽤的代码段,这时变量已经分配了存储空间。
也就是说,变量可能已经分配存储空间,但它不能被访问。
在程序加载到内存中时,有些变量就已经分配存储空间,并且这个存储空间直到整个程序执⾏完毕,从内存中退出时才会被释放。
这些变量的⽣存周期就为整个程序的⽣存周期。
如全局变量和静态局部变量。
它们的差别是全部变量的作⽤域⼀般为定义处到它所在⽂件结束。
要在全局变量定义位置之前或其他源⽂件中引⽤该全局变量,需要⽤extern来扩展该全局变量的作⽤域。
程序中有的变量在程序加载到内存中时并不分配存储空间,⽽是到定义它的函数被调⽤执⾏时才会临时分配存储空间,并且⼀旦该函数执⾏完毕返回到被调⽤处,这些变量的存储空间会被回收。
如⾮静态局部或⾃动变量。
⼀个局部变量,如果没有⽤static修饰则⾃动为auto,即这种情况下⽣存期为函数调⽤到函数返回这个时间段。
对于⾮静态局部变量,⽣存期和作⽤域都为其所在定义的函数对于静态局部变量,它的⽣存期是整个程序⽣命周期,但作⽤域依旧为定义它的函数内部全局变量与静态局部变量如果未初始化,值为0⾮静态局部变量未初始化,值不定。
1. ⼀般情况下全局变量定义函数外,局部变量定义函数内;全局变量作⽤范围是全局,局部变量作⽤范围在函数内;2. 静态变量定义在函数外,则为静态全局变量,作⽤范围为当前⽂件;定义在函数内,则为局部静态变量,作⽤范围同局部变量;3. 如果在全局范围要经常⽤到某个值,则设置为静态变量,否则定义为普通全局变量即可;4. c、c++和java可以定义静态变量,go和python不能定义静态变量;。
变量和基本类型课件
全局变量和局部变量
全局变量在程序的任何位置都可以被访问和修改。
局部变量只能在定义它的函数或代码块中被访问和修改。
全局变量和局部变量具有不同的生命周期和作用域,使用时应根据需要选择适当的 变量类型。
06
常见错误和注意事项
变量命名错误
总结词
变量命名错误通常是由于变量名与保留 字冲突或命名不符合规范所导致的。
默认初始化值
某些编程语言会在变量声明时为 其赋予一个默认初始化值,如C 中的整型变量默认为0,浮点型
变量默认为0.0。
默认初始化值
默认初始化值的规则
不同的编程语言有不同的规则,但通常来说,数值类型的变量会被初始化为0,布尔类型的变量会被初始化为 false,引用类型的变量会被初始化为null或空。
在使用变量之前,应先对其进行初始化,为 其分配一个明确的值。未初始化的变量可能 会导致程序出现意外的结果或崩溃。为了避 免这种错误,应在使用变量之前对其进行初 始化,并确保在使用之前已经正确地初始化 了所有变量。
THANK YOU
感谢观看
常量的定义
常量的定义
常量是在程序运行期间不能改变其值 的变量。
常量的用途
常量的声明
在大多数编程语言中,常量在使用之 前需要先声明,声明时需要指定常量 的类型和名称,并且其值在声明后不 能被修改。
常量用于存储程序中不会改变的值, 例如数学常数、字符串或枚举值。
02
基本数据类型
整数类型
总结词
整数类型用于表示整数数值,包括正整数、负整数和零。
注意事项
显式转换需要程序员明确指定目标类型,并需要注意数据溢出、精度损 失等问题。
类型转换的注意事项
精度问题
在进行类型转换时,需要注意精度问题。例如,将浮点数 转换为整数时,小数部分会被舍去;将大整数转换为浮点 数时,可能会存在精度限制导致精度损失。
变量的作用域和存储类别
8.3.2 外部函数 定义:定义一个函数时,在函数返回值的类型前加上 说明符“extern”,外部函数在整个源程序中都有效。 定义外部函数的一般形式: extern 返回值的类型 函数名(形式参数列表) 说明:因为函数的本质是外部的,extern说明符可以 省略,若在函数定义中没有说明extern或static则默认 为extern。外部函数可被其他编译单位中的函数调用。 例如:extern int f(int a,int b){ } 习题 填空题P135 1.
8.3 函数的存储分类 8.3.1 内部函数 定义:在一个源文件中定义的函数只能被文件中的函 数调用,而不能被同一源程序其他文件中的函数调用。 定义内部函数的一般形式: static 返回值的类型 函数名(形式参数列表) 说明:内部函数也称为静态函数,但此处静态static不 是存储方式,而是对函数的调用范围只限于本文件。 例如:static int f(int a,int b){ } 作用:函数f只能在本文件中调用,而不能在别的源文 件中调用。
第8章 变量的作用域和存储类别
本章重点 8.1 变量的作用域 8.2 变量的存储类别 8.3 函数的存储分类
8.1 变量的作用域
变量定义:指给变量分配确定的存储单元。 变量说明:说明变量的性质,而不分配存储单元。 变量作用域:变量在程序中可以被使用的有效范围。 8.1.1 局部变量 定义:指在一个函数内部或复合语句内部定义的变量。 int func1(int a) /*本函数中变量a,b,c有效*/ { int b,c; ……} 注意:形式参数与实际参数范围不同,形式参数变 量是属于被调函数的局部变量,实际参数变量是 属于主调函数的局部变量。
8.2 变量的存储类别
变量的两种属性:数据类型和数据的存储类别。 存储类别:指数据的存储位置与生存期,而变量在 内存中占据存储空间的时间称为变量的生存期。 变量存储方式可分为静态存储方式和动态存储方式。 静态存储方式:程序运行期间分配固定的存储空间。 动态存储方式:程序运行期间根据需要动态分配存 储空间。 有4个说明符与这两种存储方式相关:auto(自动的)、 static (静态的) 、 register (寄存器的) 和extern (外 部的) 。
第8章 函数(变量作用域及生存期)PPT教学课件
2020/12/10
Hale Waihona Puke 9#include <stdio.h> int d=1; /* 全局变量定义 */ void fun(int p); void main() { int a=3;
fun(a); d+=++a; /* d是全局变量 */ printf("main 函数 d=%d\n",d); } void fun(int p) { int d=5; /* 局部变量定义(与全局变量同名) */ d+=p++; /* d是局部变量 */ printf(" fun 函数 d=%d\n",d); }
动类局部变量分配在动态数据区当该函数退出后,内存空间自 动释放。
auto类变量未初始化,其值为随机值或称值不确定。
2. 静态类局部变量——static
用static修饰的局部变量是静态类局部变量。它分配在静
态数据区,当该函数退出后,其内存空间不释放,值一直保留。
static类局部变量未初始化,其值为0。
局部变量
printf("%d\t%d\t%d\n",a,b,c);
}2020/12/10
程序输出结果: 5 11 -2 467
3
思考:变量占据内存的时间(生存期)? 变量的生存期与变量的存储类别
变量的生存期:变量在内存中占据存储空间的时间。
程序代码区 静态数据区
动态数据区
存储分配
变量定义语句的一般形式:
2020/12/10
10
PPT教学课件
谢谢观看
Thank You For Watching
2020/12/10
变量的作用域和生存期PPT课件
2.静态局部类型
定义局部变量时,使用Static修饰,可以在不改变局部变量的可见域的前提下, 使变量成为静态的,即当函数撤销后,变量的值还保留。或者说,这些变量的生存期 是永久的,只是在变量的作用域外是不可见的。这样,避免了全局变量的值可以被多 处修改将引起的副作用,又可以使函数基于前一次调用的值的基础上工作。
【例4-9】演示全局变量的作用域
• Int p=1,q=5; • Float f1(int a) •{ • int b,c; • ……. •} • Char c1,c2; • Char f2(int x,int y) •{ • int i,j; • ……. •} • Int main(void) •{ • Int m,n; • ……. •}
main( ) {int k=4,m=1,p;
p=func(k,m); printf(“%d,”,p); p=func(k,m); printf(“%d\n”,p);}
func(a,b) int a,b; {static int m=0,i=2; i+=m+1; m=i+a+b; return(m);}
4.5.2 C语言中变量的存储类型
根据变童的作用域将变量分为全局变量和局部变量,根据变量的生存期将变量分 为动态变量和静态变量。因此,C语言根据作用域和生存期将变量整合成四种存储类型。
(1)局部自动类型。在函数内部用标识符auto或register 声明。 (2)静态局部类型。在函数内部,使用Static声明。 (3)静态全局类型。在函数外部,使用Static。声明,也称为静态外部变量。 (4)全局类型。不需要标识符声明。在函数外部直接声明即可,通常称为外部变 量。
1. AUTO 存储类型和REGISTER 存储类型
《变量与函数》ppt完美课件
2
自变量x的取值范围 2<x≤5
《变量与函数》完美实用课件(PPT优 秀课件 )
解:时间T是自变量,水量V是T的函数 函数解析式为 V=10-0.05T
《变量与函数》完美实用课件(PPT优 秀课件 )
《变量与函数》完美实用课件(PPT优 秀课件 )
归纳
小结
1、一般地,在一个变化过程中,如果有两__个__
变量x和y,并且对于x
的
每一个确定的值
,y都有
_唯__一__确__定__的__值__与其对应,那么我们就说x
新课讲解
下列问题中哪些量是自变量?哪些量是自变量的 函数?试写出函数的解析式. (1)改变正方形的边长x,正方形的面积s随之 改变。
解:边长x是自变量 ,面积S是x的函数 函数解析式为 s=x2
(2)每分向一水池注水0.1m3,注水量y(单位: m3)随注水时间x(单位:min)的变化而变化。
解:时间x是自变量, 水量y是x的函数 函数解析式为 y=0.1x
(3) 汽车行驶200㎞时,油箱中还有多少汽油?
解:(1)y与x的函数关系式为y=_5_0_-_0_._1_x__
(2)因为x代表的实际意义为行驶路程,所以x不能
取 负数 .且行驶中的耗油量为 0.1x ,它不能超过油
箱中现有汽油量的值50,即
0.1x≤50
因此,自变量x
的取值范围是___0_≤___x__≤___5_0__
是
自变量
,y是x的 函数 。
2、如果当x=a时,y=b,那么 a 叫做当自变
量的值为 b 时的函数值.
3、用关于
自变量的式子 表示_变__量_____
之间的关系,这种式子叫做函数的解析式.
《全局变量作用域》PPT课件
本例中定义了三个局部变量 nX, 其作用范围分别作用于 fund1,fund 和main函数 打印结果: nX in main=50 nX in fund1=100 nX in fund2=200
6
1.2 变量2、的使全用局范变围:量全局变量
在函数之外定义的变量 称为 全局变量
全局变量可以为本文件中其它函数所共用。
void main( void) {
printf( “Welcom”); unsigned int na = 100; unsigned int nb = 200; double dbA = 3.14159 * na * na; }
预编译后的源程序代码
24
2.文2 文件件包包含含------#--in#cinlucdluede
它的使用范围: 从定义变量的位置开始到本源程序文件结束
全局变量
char c1,c2; int p=1,q=5; main() { int a, b ;
a=p; b=q; ……
}
f1( int x) { int i, j, z ;
z=p+x; …… }
f2( int y) { char ch=‘a’,c2=‘b’;
2、对于占用字节数多的变量,如: long、float、double 型变量 不能 说明为寄存器型变量。
3、由于寄存器中的数据可以直接访问,因此比其它存储类别的变 量运算速度要快。所以对于反复使用的变量均可作为寄存
器变量。
4、寄存器型变量都是在某个函数中定义的,所以一旦退出该函数后 被 释放。
5、局部静态 变量不能作为寄存器变量。
c1=ch; ch=c2; …… }
7
1.2关.1 于关全于局全变局量变使量用使的用几的点几说点明说明
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
/* 说明f是其它文件(编译单位)已经定义的外部函数 */
float x,y,z; …… z=f(x,y); …… }
/* */ extern float f(float a,float b) { …… }
static float f(float a,float b)
第八章 作业
教材P128 习题八 第一大题:1、2、3、5、7、8小题; 第二大题:1、2、3、4小题;
8.4 函数的存储分类
1 外部函数 当定义一个函数时,若在函数返回值的类型前加上extern(或
缺省)时,称此函数为“外部”函数。它可以被同一个程序的其 它文件中的函数调用。
当函数调用语句与被调函数不在同一编译单位(源文件),且函 数的返回值为非整型时,应该在调用语句所在函数的说明部分用 extern对所调用的函数进行说明。
max=a[0];
average=f(x);
min=a[0];
printf("max=%d,min=%d,average=
for(i=1;i<10;i++) %f\n",max,min,average);
{sum=sum+a[i]; }
if(a[i]>max) max=a[i];
if(a[i]<min) min=a[i]);
(2) 当一个程序由多个文件组成时,每个文件都是一个独立 的编译单位。如果多个文件中都需要用同一个全局变量,这时 若在每个文件中都定义一个同名的全局变量,则单独编译各个 文件时不会产生错误,编译程序将按定义分别为它们分配存储 空间;但当连接时,将产生同一变量的重复定义的错误。
解决办法是:在其中一个文件中定义的全局变量,在其它 文件中用extern进行说明,说明这些全局变量已在某一编译单 位中定义过,通知编译程序不必再为它们开辟存储单元,只是 将作用域进一步扩展到本编译单位中。
printf("** fun **:%d\n",sum);
3.人在读程序时,难以确
}
定某一时刻的当前值。
2. 全局变量作用域的扩展
(1) 当全局变量定义在后,引用它的函数在前时,应该在引 用它的函数中用extern对此全局变量进行说明,使其作用域从 extern说明处起,延伸到该函数末尾。也可将extern写在函数 之外,使其作用域延伸至文件末尾。
}
aver=sum/10.0;
return aver;
}
例8.5 全局变量与局部变量同名问题。
int sum;
运行结果为:
void fun(void);
**main(1)**:10
main()
** fun **:20
{
**main(2)**:10
sum=10;
printf("**main(1)**:%d\n",sum); 虽然全局变量的作用域大,
例:在同文件中扩展全局变量的作用域
main( )
{void gx(),gy();
extern int x,y;
…… gx(); gy();
……
扩展后 新增的 作用域
}
void gx( ) {……}
书印错!
int x,y;
void gy( ) { ……
x,y的原 作用域
}
extern int x,y;
域
……
}
/**/ extern int x; f2( ) {
printf(“%d\n”,x); /*111*/ …… } f3( ) { x++; printf(“%d\n”,x); /*112*/
…… }
3.不允许扩展其作用域的全局变量(静态全局变量)
当定义全局变量时,若加上static,则称为静态全局变量, 其作用域仅限于本编译单位(本文件)。
例8.4 编一函数求出10个整数的最大值、最小值和平均值。
main()
int max,min;
{int x[10],j;
float f(int a[10])
float average;
{ int i,sum=a[0];
for(j=0;j<10;j++)
float aver;
scanf("%d",&x[j]);
main()
{
……
}
void gx() { …… }
扩展后 x,y的 作用域
int x,y;
void gy() { ……
x,y的 作用域
}
例:在不同文件中扩展全局变量的作用域
/**/
int x,y;
main( )
{
……
扩
f1();
展
f2();
后
f3();
x,y的
x
……
作用域
的
}
作
f1( )
用
{ x=111;
2 内部函数 当定义一个函数时,若在Байду номын сангаас数返回值的类型前加上static时,
称此函数为“静态”函数(或“内部”函数)。它只能被本 编译单位中的其它函数所调用。
使用静态函数,可避免不同的编译单位因为函 数同名而引起的混乱。
例:外部函数
/* */ main() {extern float f(float a,float b);
第19讲
函数的存储分类
2020/12/10
1
8.3 全局变量及其作用域和生存期
全局变量只有静态一种类别,放在静态存储区。
1. 全局变量的作用域和生存期 全局变量是可以在函数外部任意位置上定义的变量,它的 作用域是从定义点到整个源文件结束。
说明: (1)全局变量为函数之间的数据传递提供了一条通道。由于同
/**/ static int n; void f(); main() { …… f(); }
n的作 用域被 限定死
/**/ extern int n; void f() {
…… }
注意:static对局部变量和全局变量的作用效果不同。对局 部变量:作用域没变,存储类改为静态;对全局变量:存储 类没变,作用域仅限于本文件(小全局)。
fun();
生存期长,用起来似乎方便
printf("**main(2)**:%d\n",sum); 灵活,但除十分必要外,一
}
般不提倡使用全局变量。主
void fun(void)
要有以下原因:
{
全局变量sum在fun
int sum; 函数中不起作用。
sum=20;
1.长期占用存储空间。 2.影响了函数的独立性, 不便于移植。