C语言第8章函数与预处理命令.ppt
第第8 8章章 函数与预处理命令函数与预处理命令华北电力大学华北电力大学 计算机系计算机系C C 语言程序设计语言程序设计(2)2005年3月1第第8章章 函数与预处理命令函数与预处理命令 8.6 变量的存储类别及变量的生存期变量的存储类别及变量的生存期8.7 编译预处理编译预处理8.8 多文件程序的调试方法多文件程序的调试方法8.9 指向函数的指针变量指向函数的指针变量28.6 变量的存储类别及变量的生存期变量的存储类别及变量的生存期8.6.1 8.6.1 变量的生存期与变量的存储分类变量的生存期与变量的存储分类变量的生存期与变量的存储分类变量的生存期与变量的存储分类变量的生存期变量的生存期:变量在内存中占据存储空间的时间。:变量在内存中占据存储空间的时间。思考思考思考思考:1.1.何时何时何时何时为变量分配内存单元为变量分配内存单元为变量分配内存单元为变量分配内存单元?2.2.将变量分配在内存的什么将变量分配在内存的什么将变量分配在内存的什么将变量分配在内存的什么区域区域区域区域?3 3.变量占据内存的变量占据内存的变量占据内存的变量占据内存的时间时间时间时间(生存期生存期生存期生存期)?)?)?)?程序代码区静态存储区动态存储区存储分配存储分配动态存储变动态存储变量量静态存储变量静态存储变量38.6.2 变量的存储类别变量的存储类别变变量量的的属属性性数据类型:数据类型:数据类型:数据类型:intint x;x;决定为变量分配内存单元的长度,决定为变量分配内存单元的长度,决定为变量分配内存单元的长度,决定为变量分配内存单元的长度,数据的存放形式,数据的存放形式,数据的存放形式,数据的存放形式,数的范围。数的范围。数的范围。数的范围。存储类别:存储类别:存储类别:存储类别:staticstatic int x;int x;决定了变量的生存期,决定了变量的生存期,决定了变量的生存期,决定了变量的生存期,给它分配在哪个存储区。给它分配在哪个存储区。给它分配在哪个存储区。给它分配在哪个存储区。4变量定义语句的一般形式变量定义语句的一般形式 存储类别存储类别存储类别存储类别 数据类型数据类型数据类型数据类型 变量名变量名变量名变量名1,1,变量名变量名变量名变量名n;n;autoauto(自动的)(自动的)(自动的)(自动的)registerregister(寄存器的)(寄存器的)(寄存器的)(寄存器的)staticstatic(静态的)(静态的)(静态的)(静态的)externextern(外部的)(外部的)(外部的)(外部的)1自动变量(自动变量(auto类别,可以省略)类别,可以省略)局部变量可以定义为自动变量。局部变量可以定义为自动变量。void main()int x,y;void main()auto int x,y;自动变量自动变量自动变量自动变量等价等价可省5 内存分配内存分配内存分配内存分配调用函数或执行分程序时在调用函数或执行分程序时在调用函数或执行分程序时在调用函数或执行分程序时在动态存储区动态存储区动态存储区动态存储区为其分配存为其分配存为其分配存为其分配存储单元,函数或分程序执行结束,所占内存空间即储单元,函数或分程序执行结束,所占内存空间即储单元,函数或分程序执行结束,所占内存空间即储单元,函数或分程序执行结束,所占内存空间即刻释放。刻释放。刻释放。刻释放。变量的初值变量的初值变量的初值变量的初值定义变量时若没赋初值,变量的定义变量时若没赋初值,变量的定义变量时若没赋初值,变量的定义变量时若没赋初值,变量的初值不确定初值不确定初值不确定初值不确定;如果;如果;如果;如果赋初值则每次函数被调用时执行一次赋值操作。赋初值则每次函数被调用时执行一次赋值操作。赋初值则每次函数被调用时执行一次赋值操作。赋初值则每次函数被调用时执行一次赋值操作。生存期生存期生存期生存期 在函数或分程序执行期间。在函数或分程序执行期间。在函数或分程序执行期间。在函数或分程序执行期间。作用域作用域作用域作用域自动变量所在的函数内或分程序内。自动变量所在的函数内或分程序内。自动变量所在的函数内或分程序内。自动变量所在的函数内或分程序内。自动变量自动变量62静态变量(静态变量(static类别)类别)除形参外,局部变量和全局变量都可以定义为静除形参外,局部变量和全局变量都可以定义为静除形参外,局部变量和全局变量都可以定义为静除形参外,局部变量和全局变量都可以定义为静态变量。态变量。态变量。态变量。局部静态变量(或称内部静态变量)局部静态变量(或称内部静态变量)局部静态变量(或称内部静态变量)局部静态变量(或称内部静态变量)全局静态变量(或称外部静态变量)全局静态变量(或称外部静态变量)静态变量静态变量静态变量静态变量静态变量静态变量静态变量静态变量static int a;main()float x,y;f()static int b=1;全局静态变量全局静态变量局部静态变量局部静态变量局部静态变量局部静态变量自动变量自动变量自动变量自动变量不能省7 内存分配内存分配内存分配内存分配编译时,将其分配在内存的编译时,将其分配在内存的编译时,将其分配在内存的编译时,将其分配在内存的静态存储区静态存储区静态存储区静态存储区中,程序运中,程序运中,程序运中,程序运行结束释放该单元。行结束释放该单元。行结束释放该单元。行结束释放该单元。静态变量的初值静态变量的初值静态变量的初值静态变量的初值若定义时未赋初值,在编译时,系统自动赋初值为若定义时未赋初值,在编译时,系统自动赋初值为若定义时未赋初值,在编译时,系统自动赋初值为若定义时未赋初值,在编译时,系统自动赋初值为0 0 0 0;若定义时赋初值,则仅在编译时赋初值一次,;若定义时赋初值,则仅在编译时赋初值一次,;若定义时赋初值,则仅在编译时赋初值一次,;若定义时赋初值,则仅在编译时赋初值一次,程序运行后不再给变量赋初值程序运行后不再给变量赋初值程序运行后不再给变量赋初值程序运行后不再给变量赋初值 。生存期生存期生存期生存期整个程序的执行期间。整个程序的执行期间。整个程序的执行期间。整个程序的执行期间。作用域作用域作用域作用域局部静态变量的作用域是它所在的函数或分程序。局部静态变量的作用域是它所在的函数或分程序。局部静态变量的作用域是它所在的函数或分程序。局部静态变量的作用域是它所在的函数或分程序。全局静态变量的作用域是从定义处开始到本源文件全局静态变量的作用域是从定义处开始到本源文件全局静态变量的作用域是从定义处开始到本源文件全局静态变量的作用域是从定义处开始到本源文件结束。结束。结束。结束。静态变量静态变量8#include#include int func(int n)int func(int n)int f=1;int f=1;f=f*n;f=f*n;return f;return f;void main()void main()int i,n=5;int i,n=5;for(i=2;i=n;i+)for(i=2;i=n;i+)printf(“%d,”,func(i);printf(“%d,”,func(i);#include#include int func(int n)int func(int n)static int f=1;static int f=1;f=f*n;f=f*n;return f;return f;void main()void main()int i,n=7;int i,n=7;for(i=2;i=n;i+)for(i=2;i=n;i+)printf(“%d,”,func(i);printf(“%d,”,func(i);运行结果:运行结果:2,3,4,5,6,7,运行结果:运行结果:2,6,24,120,720,5040,9int c;static int a;main()float x,yx,y;char s;f()static int b=1;3.外部变量(外部变量(extern类别)类别)在函数外定义的变量若没有用在函数外定义的变量若没有用在函数外定义的变量若没有用在函数外定义的变量若没有用 staticstatic说明,则是外说明,则是外说明,则是外说明,则是外部变量。外部变量只能隐式定义为部变量。外部变量只能隐式定义为部变量。外部变量只能隐式定义为部变量。外部变量只能隐式定义为externextern类别,不类别,不类别,不类别,不能显式定义。能显式定义。能显式定义。能显式定义。全局静态变量全局静态变量自动变量自动变量自动变量自动变量局部静态变量局部静态变量局部静态变量局部静态变量外部变量外部变量10 内存分配内存分配内存分配内存分配编译时,将其分配在编译时,将其分配在编译时,将其分配在编译时,将其分配在静态存储区静态存储区静态存储区静态存储区,程序,程序,程序,程序运行结束释放该单元。运行结束释放该单元。运行结束释放该单元。运行结束释放该单元。变量的初值变量的初值变量的初值变量的初值若定义变量时未赋初值,在编译时,系若定义变量时未赋初值,在编译时,系若定义变量时未赋初值,在编译时,系若定义变量时未赋初值,在编译时,系统自动赋初值为统自动赋初值为统自动赋初值为统自动赋初值为0 0 0 0。生存期生存期生存期生存期整个程序的执行期间。整个程序的执行期间。整个程序的执行期间。整个程序的执行期间。作用域作用域作用域作用域从定义处开始到本源文件结束。从定义处开始到本源文件结束。从定义处开始到本源文件结束。从定义处开始到本源文件结束。此外,还可以用此外,还可以用此外,还可以用此外,还可以用externexternexternextern进行声明,以使进行声明,以使进行声明,以使进行声明,以使其作用域扩大到该程序的其它文件中。其作用域扩大到该程序的其它文件中。其作用域扩大到该程序的其它文件中。其作用域扩大到该程序的其它文件中。外部变量外部变量问题:问题:全局静全局静态变量态变量的作用的作用域可以域可以扩展到扩展到本程序本程序的其它的其它文件吗文件吗?11外部变量声明的一般格式外部变量声明的一般格式 externextern 数据类型数据类型数据类型数据类型 变量名变量名变量名变量名1 1,变量名,变量名,变量名,变量名n n;或或或或 externextern 变量名变量名变量名变量名1 1,变量名,变量名,变量名,变量名n n;注意:注意:外部变量外部变量声明用关键字声明用关键字externextern,而外部变量的,而外部变量的定义不能用定义不能用externextern,只能隐式定义。,只能隐式定义。定义外部变量时,系统要给变量分配存储空间,定义外部变量时,系统要给变量分配存储空间,而对外部变量声明时,系统不分配存储空间,而对外部变量声明时,系统不分配存储空间,只是让编译系统知道该变量是一个已经定义过只是让编译系统知道该变量是一个已经定义过的外部变量,与函数声明的作用类似。的外部变量,与函数声明的作用类似。12int p=1,q=5;int p=1,q=5;float f1(int a)float f1(int a)extern char c1,c2;extern char c1,c2;char c1,c2;char c1,c2;char f2(int x,int y)char f2(int x,int y)main()main()外部变量声明外部变量声明定义外部变量定义外部变量定义外部变量定义外部变量定义外部变量定义外部变量定义外部变量定义外部变量思考:思考:在在f1函数中声明函数中声明c1、c2的作用是什么?如何修改的作用是什么?如何修改程序使所有函数都可以使用程序使所有函数都可以使用外部变量而又不需要声明?外部变量而又不需要声明?【例例8.24】在一个文件内声明外部变量。在一个文件内声明外部变量。13【例例例例8.258.25】在多文件的程序中声明外部变量。在多文件的程序中声明外部变量。在多文件的程序中声明外部变量。在多文件的程序中声明外部变量。file1.cfile1.c文件中程序如下:文件中程序如下:文件中程序如下:文件中程序如下:#include#include int i;int i;void main()void main()void f1(),f2(),f3();void f1(),f2(),f3();i=1;i=1;f1();f1();printf(tmain:i=%d,i);printf(tmain:i=%d,i);f2();f2();printf(tmain:i=%d,i);printf(tmain:i=%d,i);f3();f3();printf(tmain:i=%dn,i);printf(tmain:i=%dn,i);void f1()void f1()i+;i+;printf(nf1:i=%d,i);printf(nf1:i=%d,i);file2.c文件中程序如下:文件中程序如下:#include extern int i;void f2()int i=3;printf(nf2:i=%d,i);void f3()i=3;printf(nf3:i=%d,i);程序输出结果:程序输出结果:f1:i=2 main:i=2f2:i=3 main:i=2f3:i=3 main:i=3声明外部变量声明外部变量定义外部变量定义外部变量148.6.3 归纳变量的分类归纳变量的分类1 1按照变量的作用域对变量分类按照变量的作用域对变量分类 局部变量局部变量 全局变量全局变量2 2按照变量的生存期对变量分类按照变量的生存期对变量分类 静态存储变量静态存储变量包括:局部静态变量和全局静态变量包括:局部静态变量和全局静态变量 动态存储变量动态存储变量包括:自动变量包括:自动变量15源文件源文件源文件源文件 *.*.*.*.c c c c运行文件运行文件运行文件运行文件*.*.*.*.exeexeexeexe编译编译编译编译编译编译编译编译编译编译编译编译目标文件目标文件目标文件目标文件*.*.*.*.objobjobjobj连接连接连接连接编译编译编译编译连接连接连接连接连接连接连接连接编译预处理编译预处理编译预处理编译预处理 编编编编 译译译译编译预处理包括:编译预处理包括:宏定义宏定义 文件包含文件包含 条件编译(不讲)条件编译(不讲)8.7 编译预处理编译预处理16#definedefinedefinedefine 宏名宏名宏名宏名 字符串字符串字符串字符串宏定义的功能:宏定义的功能:宏定义的功能:宏定义的功能:在进行编译前在进行编译前,用用字符串字符串原样替换程序中的原样替换程序中的宏名宏名这个替换过程称为这个替换过程称为“宏替换宏替换”或或“宏展开宏展开”,字字符串符串也称为替换文本。也称为替换文本。命令的一般格式:命令的一般格式:命令的一般格式:命令的一般格式:8.7.1 不带参数的宏定义不带参数的宏定义8.7 编译预处理(续)编译预处理(续)178.7 编译预处理(续)编译预处理(续)例如:例如:#define#define PIPI 3.143.14void main()void main()void main()void main()float r,s,c;float r,s,c;float r,s,c;float r,s,c;scanf(“%f”,&r);scanf(“%f”,&r);scanf(“%f”,&r);scanf(“%f”,&r);s=r*r*s=r*r*s=r*r*s=r*r*PIPIPIPI;c=2*r*c=2*r*c=2*r*c=2*r*PIPIPIPI;printf(“s=%f,printf(“s=%f,printf(“s=%f,printf(“s=%f,c=%f”,s,c);c=%f”,s,c);c=%f”,s,c);c=%f”,s,c);替替换换3.143.143.143.14编编 译译188.7 编译预处理(续)编译预处理(续)双引号中有与宏名相同的字符串不进行替换。双引号中有与宏名相同的字符串不进行替换。双引号中有与宏名相同的字符串不进行替换。双引号中有与宏名相同的字符串不进行替换。已经定义的宏名可以被后定义的宏名引用。在预处已经定义的宏名可以被后定义的宏名引用。在预处已经定义的宏名可以被后定义的宏名引用。在预处已经定义的宏名可以被后定义的宏名引用。在预处理时将层层进行替换。理时将层层进行替换。理时将层层进行替换。理时将层层进行替换。说明说明:为了增加程序的可读性,建议宏名用大写字母,为了增加程序的可读性,建议宏名用大写字母,为了增加程序的可读性,建议宏名用大写字母,为了增加程序的可读性,建议宏名用大写字母,其他的标识符用小写字母。其他的标识符用小写字母。其他的标识符用小写字母。其他的标识符用小写字母。19【例例7.29】不带参数的宏定义。不带参数的宏定义。源程序:源程序:源程序:源程序:#define PI 3.14#define PI 3.14#define PI 3.14#define PI 3.14#define S PI*r*r#define S PI*r*r#define S PI*r*r#define S PI*r*r#define V 4*S*r/3#define V 4*S*r/3#define V 4*S*r/3#define V 4*S*r/3void main()void main()void main()void main()float r;float r;float r;float r;printf(nInput r:);printf(nInput r:);printf(nInput r:);printf(nInput r:);scanf(%f,&r);scanf(%f,&r);scanf(%f,&r);scanf(%f,&r);printf(S=%.2f V=%.2fn,printf(S=%.2f V=%.2fn,printf(S=%.2f V=%.2fn,printf(S=%.2f V=%.2fn,S S S S,V V V V););););编译预处理后的程序:编译预处理后的程序:void main()void main()float r;float r;printf(nInput r:);printf(nInput r:);scanf(%f,&r);scanf(%f,&r);printf(S=%.2f V=%.2fn,printf(S=%.2f V=%.2fn,3.14*r*r 3.14*r*r,4*4*3.14*r*r3.14*r*r *r/3*r/3););SVSV进入编译进入编译进入编译进入编译20命令的一般形式命令的一般形式命令的一般形式命令的一般形式8.7.2 带参数的宏定义带参数的宏定义#define#define#define#define 宏名宏名宏名宏名(形参表形参表形参表形参表)字符串字符串字符串字符串功能功能:在编译预处理时,把源程序中所有在编译预处理时,把源程序中所有带参数的宏名带参数的宏名用宏定义中的用宏定义中的字符串字符串替换,并且用宏名后圆括号中替换,并且用宏名后圆括号中的的实参替换实参替换字符串中的字符串中的形参形参。例如:例如:#define MAX(X,Y)(X)(Y)?(X):(Y)8.7 编译预处理(续)编译预处理(续)218.7 编译预处理(续)编译预处理(续)【例例例例8.308.30】带参数的宏定义。带参数的宏定义。带参数的宏定义。带参数的宏定义。#define MAX(x,y)#define MAX(x,y)(x)(y)?(x):(y)(x)(y)?(x):(y)void main()void main()printf(%dn,a,b,printf(%dn,a,b,MAX(a,b)MAX(a,b););printf(%dn,printf(%dn,MAX(a+m,b+n)MAX(a+m,b+n););分两次替换:分两次替换:将宏名将宏名MAX(a,b)MAX(a,b)替换成字符串替换成字符串(x)(y)?(x):(y)(x)(y)?(x):(y)。用实参用实参a替换形参替换形参x,实参,实参b替换形参替换形参y。程序中的两个程序中的两个printf语句被展开为:语句被展开为:printf(%dn,(a)(b)?(a):(b);printf(%dn,(a+m)(b+n)?(a+m):(b+n);228.7 编译预处理(续)编译预处理(续)【例例例例8.318.31】分析下面程序运行后的输出结果。分析下面程序运行后的输出结果。分析下面程序运行后的输出结果。分析下面程序运行后的输出结果。#define MA(x)#define MA(x)x*(x-1)x*(x-1)void main()void main()int a=1,b=2;int a=1,b=2;printf(%dn,printf(%dn,MA(1+a+b)MA(1+a+b););分两次替换:分两次替换:MA(1+a+b)MA(1+a+b)用用x*(x-1)x*(x-1)替换。替换。用用1+a+b替换替换x。printf语句被展开为:语句被展开为:printf(%dn,1+a+b*(1+a+b-1);特别注意:特别注意:由于替换文由于替换文本中的本中的x没没有用括号括有用括号括起,因此,起,因此,1+a+b也不也不能用括号括能用括号括起。起。程序输出结果:程序输出结果:8238.7 编译预处理(续)编译预处理(续)命令的一般形式命令的一般形式命令的一般形式命令的一般形式格式格式格式格式1 1:#include#include 格式格式格式格式2 2:#include#include 文件名文件名文件名文件名 8.7.3 文件包含文件包含文件包含是将指定的某个源文件的内容全部包文件包含是将指定的某个源文件的内容全部包文件包含是将指定的某个源文件的内容全部包文件包含是将指定的某个源文件的内容全部包含到当前文件中。用含到当前文件中。用含到当前文件中。用含到当前文件中。用includeinclude命令实现。命令实现。命令实现。命令实现。用用用用格式格式格式格式1 1,预处理程序仅在系统指定目录下查找指,预处理程序仅在系统指定目录下查找指,预处理程序仅在系统指定目录下查找指,预处理程序仅在系统指定目录下查找指定文件。定文件。定文件。定文件。用用用用格式格式格式格式2 2,预处理程序首先在,预处理程序首先在,预处理程序首先在,预处理程序首先在当前目录中当前目录中当前目录中当前目录中查找指定查找指定查找指定查找指定文件,若找不到再到文件,若找不到再到文件,若找不到再到文件,若找不到再到 系统指定目录中查找。系统指定目录中查找。系统指定目录中查找。系统指定目录中查找。247.8 编译预处理(续)编译预处理(续)例如:调用例如:调用例如:调用例如:调用sin(x)sin(x)函数时,要在程序的开头使用函数时,要在程序的开头使用函数时,要在程序的开头使用函数时,要在程序的开头使用如下命令:如下命令:如下命令:如下命令:#include#include 在预处理时,用在预处理时,用在预处理时,用在预处理时,用math.hmath.h文件内容替换文件内容替换文件内容替换文件内容替换#include#include 命令行。命令行。命令行。命令行。2功能功能在预处理时,将在预处理时,将在预处理时,将在预处理时,将includeinclude命令后指定文件的内命令后指定文件的内命令后指定文件的内命令后指定文件的内容替换该命令行。容替换该命令行。容替换该命令行。容替换该命令行。258.8 多文件程序的调试方法多文件程序的调试方法操作步骤如下:操作步骤如下:操作步骤如下:操作步骤如下:在在在在VC VC 环境下先建立一个工程,再在工程中建立若环境下先建立一个工程,再在工程中建立若环境下先建立一个工程,再在工程中建立若环境下先建立一个工程,再在工程中建立若干个源文件,其中只有一个文件中有主函数干个源文件,其中只有一个文件中有主函数干个源文件,其中只有一个文件中有主函数干个源文件,其中只有一个文件中有主函数main(),main(),例例例例如:文件内容如下:如:文件内容如下:如:文件内容如下:如:文件内容如下:file1.cfile1.cfile2.cfile2.cfile3.cfile3.c依次对上述依次对上述依次对上述依次对上述3 3个文件编译,编译通过之后,再运行个文件编译,编译通过之后,再运行个文件编译,编译通过之后,再运行个文件编译,编译通过之后,再运行即可即可即可即可1.使用工程文件将多个文件连接成一个可使用工程文件将多个文件连接成一个可执行文件的方法执行文件的方法例如:将例如:将例如:将例如:将file1.cfile1.c、file2.cfile2.c和和和和file3.cfile3.c合并成一个可执行文件合并成一个可执行文件合并成一个可执行文件合并成一个可执行文件。268.8多文件程序的调试方法(续)多文件程序的调试方法(续)file3.cfile3.c#include file2.c#include file3.cfile1.cfile1.cAfile2.cfile2.cBCBCAfile1.cfile1.c预处理前预处理前预处理后预处理后278.9 指向函数的指针变量指向函数的指针变量l l前面我们已经学过用指针变量间接访问一般前面我们已经学过用指针变量间接访问一般变量、一维数组元素和二维数组元素变量、一维数组元素和二维数组元素l lC语言允许用指针变量间接调用函数,使程语言允许用指针变量间接调用函数,使程序设计更加灵活方便序设计更加灵活方便指向函数的指针变量定义形式:指向函数的指针变量定义形式:函数类型函数类型 (*指针变量名指针变量名)();如:如:void (*p)();p=welcome;/函数名是函数的入口地址函数名是函数的入口地址 (*p)();/等价于等价于welcome();说明:说明:welcome是一个已经定义好的无返回是一个已经定义好的无返回值和形参的函数值和形参的函数288.9 指向函数的指针变量(续)指向函数的指针变量(续)如:如:int (*s)(int int);s=max;f=(*s)(5,7);/等价于等价于f=max(5,7);说明:说明:max是一个已经定义好的返回值为整是一个已经定义好的返回值为整型和有两个型和有两个int型参数的函数型参数的函数用指针变量调用函数的形式:用指针变量调用函数的形式:(*指针变量名指针变量名)(实参表实参表)29注意以下定义的都是什么指针变量注意以下定义的都是什么指针变量int*p,*q5,(*f)(float*,int);p:指针变量,可以存放一个整型变量的地址指针变量,可以存放一个整型变量的地址q:指针数组,有指针数组,有5个可以存放整型变量地址个可以存放整型变量地址的指针变量的指针变量f:指针变量,可以存放函数值是指针变量,可以存放函数值是int,带有两,带有两个参数,一个是个参数,一个是float的指针类型,另一个的指针类型,另一个是是int类型的函数的入口地址类型的函数的入口地址30Test.cpp#include#include int func(int n)int func(int n)static int f=1;static int f=1;f=f*n;f=f*n;return f;return f;void main()void main()int i,n=7;int i,n=7;int(*p)(int);int(*p)(int);p=func;p=func;for(i=2;i=n;i+)for(i=2;i=n;i+)printf(%d,(*p)(i);printf(%d,(*p)(i);31Test.c#include#include int func(int n)int func(int n)static int f=1;static int f=1;f=f*n;f=f*n;return f;return f;void main()void main()int i,n=7;int i,n=7;int(*p)();int(*p)();p=func;p=func;for(i=2;i=n;i+)for(i=2;i=n;i+)printf(%d,(*p)(i);printf(%d,(*p)(i);32用指针变量调用函数用指针变量调用函数l l先定义指针变量先定义指针变量l l让指针变量指向函数让指针变量指向函数 指针变量指针变量=函数名函数名l l用指针变量调用函数用指针变量调用函数 形式:形式:(*指针变量名指针变量名)(实参实参)等价于:函数名等价于:函数名(实参实参)33例题例题#include#include#include#include double func(double(*p)(double),double x)double func(double(*p)(double),double x)double z;double z;z=3.14159*x/180;/z=3.14159*x/180;/将角度换算为弧度将角度换算为弧度将角度换算为弧度将角度换算为弧度 return(*p)(z);return(*p)(z);void main()void main()printf(sin(90)=%7.2fn,func(sin,90);printf(sin(90)=%7.2fn,func(sin,90);printf(cos(90)=%7.2fn,func(cos,90);printf(cos(90)=%7.2fn,func(cos,90);运行结果:运行结果:sin(90)=1.00cos(90)=0.0034