《第8章函数2 第14次课精选PPT.ppt》由会员分享,可在线阅读,更多相关《第8章函数2 第14次课精选PPT.ppt(26页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第8章 函数2 第14次课第1页,本讲稿共26页一维数组名作函数实参一维数组名作实参时,形参的设置方法有三种:以int型为例,n表示元素个数(1)fun(int*p,int n)(2)fun(int p,int n)(3)fun(int p10,int n)/n不能超过10理解例8.12第2页,本讲稿共26页二维数组名作函数实参二维数组名作实参时,形参的设置方法有三种:以int型为例,n表示行数,m表示例数(1)fun(int(*p)4,int n,int m)(2)fun(int p 4,int n,int m)/m不能超过4(3)fun(int p104,int n,int m)/n不能超
2、过10,m不能超过4理解例8.15第3页,本讲稿共26页8.6.3函数指针函数指针1.函数指针的定义函数指针的定义函数指针的一般定义格式为:函数类型函数类型(*指针变量名指针变量名)(形参列表形参列表);2.函数指针的赋值函数指针的赋值int fun(float x);int(*fun_p)(float);fun_p=fun;第4页,本讲稿共26页 例例8.19 函数指针的用法函数指针的用法 int fun(int n)int i,sum=0;for(i=1;i=n;i+)sum+=i;return sum;void main()int(*p)(int);/为 int Sum(int n)定义
3、的函数指针/(1)int sum;p=fun;/(2)给函数指针赋值sum=p(100);/(3)通过函数指针调用函数,等价于 sum=fun(100);printf(“sum=%dn,sum);第5页,本讲稿共26页理解例8-20第6页,本讲稿共26页8.7.1 变量的作用域变量的作用域 C语言中所有的变量都有自己的作用域,按作用域语言中所有的变量都有自己的作用域,按作用域范围可分为两类:局部变量和全局变量。范围可分为两类:局部变量和全局变量。1.局部变量局部变量 局部变量是指在函数内部定义的变量,函数的局部变量是指在函数内部定义的变量,函数的形参也属于局部变量。局部变量的作用域仅限于定形参
4、也属于局部变量。局部变量的作用域仅限于定义它的函数体内部。通常,这些变量的定义放在函义它的函数体内部。通常,这些变量的定义放在函数体的最前部,即函数定义中的数体的最前部,即函数定义中的“说明语句说明语句”部分。部分。8.7 变量的作用域和存储类别变量的作用域和存储类别第7页,本讲稿共26页void fun_1(int a)int x,y;/定义定义fun_1()函数内部的局部变量函数内部的局部变量void fun_2(int a)int x,y;/定义定义 fun_2()函数内部的局部变量函数内部的局部变量void main()int x,y;/定义定义 main()函数内部的局部变量函数内部
5、的局部变量 fun_1(x);fun_2(y);【例例8.21】局部变量使用示例。局部变量使用示例。第8页,本讲稿共26页 在函数外定义的变量称为全局变量,也称外部变量。全在函数外定义的变量称为全局变量,也称外部变量。全局变量的作用域从定义的位置开始直到本源程序的结束。局变量的作用域从定义的位置开始直到本源程序的结束。【例例8-22】全局变量使用示例。全局变量使用示例。int x=2,y=3;/全局变量的定义全局变量的定义void fun(void)x+;/引用全局变量引用全局变量x和和y y+;void main()fun();x+;/引用全局变量引用全局变量x和和y y+;printf(%
6、d,%dn,x,y);2.全局变量全局变量第9页,本讲稿共26页(1)程序区)程序区(2)静态存储区)静态存储区(3)局部变量区。)局部变量区。(4)堆()堆(heap)区)区(5)文字常量区)文字常量区8.7.2 变量的存储类别变量的存储类别用户存储空间一般分为五类:用户存储空间一般分为五类:第10页,本讲稿共26页自动变量(自动变量(auto)寄存器类变量(寄存器类变量(register)静态变量(静态变量(static)外部变量(外部变量(extern)C语言中的变量存储类别分为以下四种:语言中的变量存储类别分为以下四种:第11页,本讲稿共26页 自动变量用关键字自动变量用关键字auto
7、表示,此类变量放在动态存储区表示,此类变量放在动态存储区里,是里,是C语言中使用最广泛的一种类型。函数的形参,函数语言中使用最广泛的一种类型。函数的形参,函数体或复合语句内部定义的缺省存储类别的变量都属于自动变体或复合语句内部定义的缺省存储类别的变量都属于自动变量。自动变量定义的格式为:量。自动变量定义的格式为:auto 数据类型说明符数据类型说明符 变量名表;变量名表;例如,例如,int x;等价于等价于 auto int x;注意:不能在声明形参时使用注意:不能在声明形参时使用auto关键字。关键字。1.自动变量(自动变量(auto)第12页,本讲稿共26页(1)自动变量的作用域仅限于定义
8、该变量的函数或复合)自动变量的作用域仅限于定义该变量的函数或复合语句内。语句内。(2)自动变量的生存期从定义该变量的函数调用开始到函)自动变量的生存期从定义该变量的函数调用开始到函数运行结束。因此函数调用结束之后,自动变量的值不能保数运行结束。因此函数调用结束之后,自动变量的值不能保留;在复合语句中定义的自动变量,在退出复合语句后也不留;在复合语句中定义的自动变量,在退出复合语句后也不能再使用。能再使用。(3)由于自动变量的作用域和生存期限于定义它的函数)由于自动变量的作用域和生存期限于定义它的函数体或复合语句内,因此,不同的函数或复合语句中允许体或复合语句内,因此,不同的函数或复合语句中允许
9、使用同名的变量而不会混淆。使用同名的变量而不会混淆。auto变量具有以下特点:变量具有以下特点:第13页,本讲稿共26页 寄存器变量用关键字寄存器变量用关键字register表示,也属于动态变量,表示,也属于动态变量,它与它与auto变量的区别是:变量的区别是:register变量的值存放在变量的值存放在CPU的的寄存器中,寄存器中,auto变量的值存放在内存单元中。程序运行时,变量的值存放在内存单元中。程序运行时,CPU访问寄存器的速度比访问内存的速度快,因此把变量设访问寄存器的速度比访问内存的速度快,因此把变量设置为置为register型将提高程序运行的速度。寄存器变量定义的型将提高程序运
10、行的速度。寄存器变量定义的格式为:格式为:register 数据类型说明符数据类型说明符 变量名表;变量名表;例如,例如,register int x;2.寄存器变量(寄存器变量(register)第14页,本讲稿共26页 静态变量用关键字静态变量用关键字static表示,此类变量存放在静态存储表示,此类变量存放在静态存储区里。一旦为其分配了存储单元,在整个程序运行期间,将固区里。一旦为其分配了存储单元,在整个程序运行期间,将固定占用存储单元,直到程序运行结束。定占用存储单元,直到程序运行结束。静态变量定义的格式为:静态变量定义的格式为:static 数据类型说明符数据类型说明符 变量名表;变
11、量名表;例如,例如,static int x;静态变量分为两种:静态局部变量静态变量分为两种:静态局部变量 和和 静态全局变量。静态全局变量。3.静态变量(静态变量(static)第15页,本讲稿共26页static型局部变量和型局部变量和auto型、型、register型局部变量在使用上的型局部变量在使用上的区别是:区别是:(1)static型局部变量在程序的整个运行期间永久性地占用型局部变量在程序的整个运行期间永久性地占用存储单元,即使退出某个用户自定义函数,下次再进入该函存储单元,即使退出某个用户自定义函数,下次再进入该函数时,静态局部变量仍保留上一次退出函数时的值。而数时,静态局部变量
12、仍保留上一次退出函数时的值。而auto型或型或register型局部变量在退出函数后,其存储单元就释放型局部变量在退出函数后,其存储单元就释放掉,数值也随之消失。掉,数值也随之消失。(2)static型局部变量定义后如果未赋初值,则型局部变量定义后如果未赋初值,则C程序自动程序自动给它赋值为给它赋值为0。而。而auto型变量如果未赋初值,其初值是随机型变量如果未赋初值,其初值是随机数。数。(3)static型局部变量的初值是在编译时赋予的,而型局部变量的初值是在编译时赋予的,而auto型型变量是在程序执行过程中赋值的。变量是在程序执行过程中赋值的。1)静态局部变量静态局部变量第16页,本讲稿共
13、26页例8.25以下程序是static型局部变量应用的实例,请观察运行结果。int fun(int,int);void main(void)int k=4,m=1,p;p=fun(k,m);/第一次调用fun()函数printf(1)%dn,p);p=fun(k,m);/第二次调用fun()函数printf(2)%dn,p);int fun(int a,int b)static int m=2;/定义静态型局部变量 int n=1;n=m+n;m=n+a+b;return(m);程序运行结果:程序运行结果:(1)8(2)14 第17页,本讲稿共26页 在全局变量说明的前面再加上在全局变量说明的
14、前面再加上static就构成了静态就构成了静态全局变量。全局变量本身就存放在静态存储区,静态全局变量。全局变量本身就存放在静态存储区,静态全局变量当然也存放在静态存储区。全局变量当然也存放在静态存储区。这两者的区别在于:当一个程序由多个源文件(这两者的区别在于:当一个程序由多个源文件(.c)组成时,非静态全局变量的作用域是整个源程序,即在所组成时,非静态全局变量的作用域是整个源程序,即在所有源文件中都有效;而静态全局变量的作用域仅限于定义有源文件中都有效;而静态全局变量的作用域仅限于定义该变量的这个源程序本身,其它源文件不能引用它。该变量的这个源程序本身,其它源文件不能引用它。2)静态全局变量
15、静态全局变量第18页,本讲稿共26页 外部变量用关键字外部变量用关键字extern说明,此类变量存放在静说明,此类变量存放在静态存储区。外部变量的定义在所有函数体之外,它的态存储区。外部变量的定义在所有函数体之外,它的作用域从变量的定义处开始到本程序文件的结尾。外作用域从变量的定义处开始到本程序文件的结尾。外部变量定义的格式为:部变量定义的格式为:extern 数据类型说明符数据类型说明符 变量名表;变量名表;例如,例如,extern int x;只有定义为只有定义为extern类型的外部变量才能供其它文件使类型的外部变量才能供其它文件使用。用。4.外部变量(外部变量(extern)第19页,
16、本讲稿共26页 文件包含命令行的一般形式为:文件包含命令行的一般形式为:#include 或或#include “文件名文件名”例如例如:#include#include 8.8 编译预处理编译预处理8.8.1 文件包含文件包含第20页,本讲稿共26页 无参宏的宏名后不带参数。其定义的一般形式为:无参宏的宏名后不带参数。其定义的一般形式为:#define 标识符标识符 替换文本替换文本其中的其中的“#”表示这是一条预处理命令。凡是以表示这是一条预处理命令。凡是以“#”开开头的均为预处理命令。头的均为预处理命令。“define”为宏定义命令。为宏定义命令。“标标识符识符”为所定义的宏名。为所定义
17、的宏名。“替换文本替换文本”可以是常量、表可以是常量、表达式、字符串等。达式、字符串等。8.8.2 宏定义宏定义1.不带参数的宏定义不带参数的宏定义第21页,本讲稿共26页 在宏定义中的参数称为形式参数,在宏调用中的参数称在宏定义中的参数称为形式参数,在宏调用中的参数称为实际参数。带参宏定义的一般形式为:为实际参数。带参宏定义的一般形式为:#define 宏名宏名(形参表形参表)字符串字符串带参宏调用的一般形式为:带参宏调用的一般形式为:宏名宏名(实参表实参表);例如例如:#define MAX(x,y)(x y)?x:y /*宏定义宏定义*/m=MAX(5,3);/*宏调用宏调用*/2.带参
18、数的宏定义带参数的宏定义第22页,本讲稿共26页#ifdef命令的一般形式为:命令的一般形式为:#ifdef 标识符标识符 代码段代码段1#else 代码段代码段2#endif 当标识符用当标识符用#define定义过时,代码段定义过时,代码段1参与编译,参与编译,否则代码段否则代码段2参与编译。参与编译。#else及代码段及代码段2是可省略的,是可省略的,省略后,当标识符未定义过时,省略后,当标识符未定义过时,#ifdef与与#endif之之间无代码段参与编译。间无代码段参与编译。8.8.3 条件编译命令条件编译命令#ifdef和和#ifndef 1.#ifdef第23页,本讲稿共26页#i
19、nclude#define LIint main()#ifdef LIprintf(Hello,LI!n);#elseprintf(Hello,everyone!n);#endifreturn 0;程序的运行结果为:程序的运行结果为:Hello,LI!【例8-26】使用#ifdef#else#endif 条件编译命令 第24页,本讲稿共26页#ifndef命令的一般形式为:命令的一般形式为:#ifndef 标识符标识符 代码段代码段1#else 代码段代码段2#endif#ifndef的用法与的用法与#ifdef相反,当标识符未用相反,当标识符未用#define定义定义过时,代码段过时,代码段1参与编译,否则代码段参与编译,否则代码段2参与编译。参与编译。#else及代码段及代码段2是可能省略的,省略后,当标识符定义过时,是可能省略的,省略后,当标识符定义过时,#ifndef与与#endif之间无代码段参与编译。之间无代码段参与编译。2.#ifndef#else#endif 第25页,本讲稿共26页完成并理解完成并理解例例8-12,8-12,例例8-15,8-15,例例8-19,8-19,例例8-25,8-25,例8-29习题习题8.3 (8)8.3 (8)第14次上机作业第26页,本讲稿共26页
限制150内