
C语言程序设计重庆大学课件第05章指针与函数.ppt
23页程序设计技术程序设计技术n nC C C C语言数据描述和语言数据描述和语言数据描述和语言数据描述和C C C C程序设计初步程序设计初步程序设计初步程序设计初步 n n结构化程序设计基础和结构化程序设计基础和结构化程序设计基础和结构化程序设计基础和C C C C语言的控制结构语言的控制结构语言的控制结构语言的控制结构 n n数组及其应用数组及其应用数组及其应用数组及其应用 n n函数与函数与函数与函数与C C C C程序结构程序结构程序结构程序结构 n n指针与函数指针与函数指针与函数指针与函数 n n指针与数组指针与数组指针与数组指针与数组 n n字符串及其应用字符串及其应用字符串及其应用字符串及其应用 n n结构体类型和联合体类型结构体类型和联合体类型结构体类型和联合体类型结构体类型和联合体类型 n nC C C C语言的文件处理及其应用语言的文件处理及其应用语言的文件处理及其应用语言的文件处理及其应用 n n位运算与枚举类型位运算与枚举类型位运算与枚举类型位运算与枚举类型指针与函数指针与函数n n指向函数的指针指向函数的指针指向函数的指针指向函数的指针 n n返回指针值的函数返回指针值的函数返回指针值的函数返回指针值的函数 指向函数的指针指向函数的指针n n指向函数指针变量的定义指向函数指针变量的定义指向函数指针变量的定义指向函数指针变量的定义 n n用指向函数的指针变量来调用函数用指向函数的指针变量来调用函数用指向函数的指针变量来调用函数用指向函数的指针变量来调用函数 n n指向函数的指针变量作函数参数指向函数的指针变量作函数参数指向函数的指针变量作函数参数指向函数的指针变量作函数参数 5.1.1 5.1.1 指向函数指针变量的定义指向函数指针变量的定义n n指向函数的指针变量指向函数的指针变量指向函数的指针变量指向函数的指针变量(简称函数指针)(简称函数指针)(简称函数指针)(简称函数指针)n n每一个函数都是一个程序模块,这个模块在内存中都占有每一个函数都是一个程序模块,这个模块在内存中都占有每一个函数都是一个程序模块,这个模块在内存中都占有每一个函数都是一个程序模块,这个模块在内存中都占有一片存储区,一片存储区,一片存储区,一片存储区,函数名函数名函数名函数名代表了该存储区的代表了该存储区的代表了该存储区的代表了该存储区的首地址首地址首地址首地址,称为函数,称为函数,称为函数,称为函数的入口地址的入口地址的入口地址的入口地址 。
定义一个指针变量并且使它指向函数的入定义一个指针变量并且使它指向函数的入定义一个指针变量并且使它指向函数的入定义一个指针变量并且使它指向函数的入口地址,就称这个指针变量为指向函数的指针变量口地址,就称这个指针变量为指向函数的指针变量口地址,就称这个指针变量为指向函数的指针变量口地址,就称这个指针变量为指向函数的指针变量n n指向函数的指针变量的定义指向函数的指针变量的定义指向函数的指针变量的定义指向函数的指针变量的定义 < < < <存储类别存储类别存储类别存储类别> <> <> <> <数据类型数据类型数据类型数据类型>(*>(*>(*>(*指针变量名指针变量名指针变量名指针变量名)([)([)([)([形参表形参表形参表形参表]);]);]);]);n n存储类别存储类别存储类别存储类别 函数指针变量本身的存储特性;函数指针变量本身的存储特性;函数指针变量本身的存储特性;函数指针变量本身的存储特性; n n数据类型数据类型数据类型数据类型 指针指向的指针指向的指针指向的指针指向的函数的返回值类型;函数的返回值类型;函数的返回值类型;函数的返回值类型;n n给指向函数的指针变量赋值:给指向函数的指针变量赋值:给指向函数的指针变量赋值:给指向函数的指针变量赋值: 指向函数的指针变量=函数名指向函数的指针变量=函数名指向函数的指针变量=函数名指向函数的指针变量=函数名; ; ; ; n n函数指针的调用格式函数指针的调用格式函数指针的调用格式函数指针的调用格式 (*(*(*(*函数指针变量函数指针变量函数指针变量函数指针变量)([)([)([)([实参表实参表实参表实参表])])])])指向函数的指针指向函数的指针n n指向函数指针变量的定义指向函数指针变量的定义指向函数指针变量的定义指向函数指针变量的定义 n n用指向函数的指针变量来调用函数用指向函数的指针变量来调用函数用指向函数的指针变量来调用函数用指向函数的指针变量来调用函数 n n指向函数的指针变量作函数参数指向函数的指针变量作函数参数指向函数的指针变量作函数参数指向函数的指针变量作函数参数 定义指向函数的指针变量后,就可将一个定义指向函数的指针变量后,就可将一个定义指向函数的指针变量后,就可将一个定义指向函数的指针变量后,就可将一个函数名函数名函数名函数名赋给赋给赋给赋给该指针变量。
此后,对该指针变量的指针运算就是使该指针变量此后,对该指针变量的指针运算就是使该指针变量此后,对该指针变量的指针运算就是使该指针变量此后,对该指针变量的指针运算就是使程序控制转移到指针指向的程序控制转移到指针指向的程序控制转移到指针指向的程序控制转移到指针指向的函数入口地址函数入口地址函数入口地址函数入口地址去执行该函去执行该函去执行该函去执行该函数的函数体数的函数体数的函数体数的函数体例如:有函数说明为:例如:有函数说明为: void swap(int x,int y)void swap(int x,int y)void swap(int x,int y)void swap(int x,int y);;;; 指向函数的指针变量定义:指向函数的指针变量定义:指向函数的指针变量定义:指向函数的指针变量定义: void (*fp)(int x,int y);void (*fp)(int x,int y);void (*fp)(int x,int y);void (*fp)(int x,int y); 将函数名将函数名将函数名将函数名swapswapswapswap赋给函数指针变量赋给函数指针变量赋给函数指针变量赋给函数指针变量fpfpfpfp:::: fp=swap;fp=swap;fp=swap;fp=swap; 使用函数指针变量使用函数指针变量使用函数指针变量使用函数指针变量fpfpfpfp调用函数调用函数调用函数调用函数swapswapswapswap的形式:的形式:的形式:的形式: (*fp)(a,b)(*fp)(a,b)(*fp)(a,b)(*fp)(a,b) fp(a,b)fp(a,b)fp(a,b)fp(a,b); ; ; ; 5.1.2 5.1.2 用指向函数的指针变量调用函数用指向函数的指针变量调用函数例例例例5-15-15-15-1 编程序计算下面的公式,其中编程序计算下面的公式,其中n n从键盘输从键盘输入,要求使用指向函数的指针变量来实现。
入,要求使用指向函数的指针变量来实现n(n(n(n为奇数时为奇数时为奇数时为奇数时) ) ) )(n(n(n(n为偶数时为偶数时为偶数时为偶数时) ) ) )5.1.2 5.1.2 用指向函数的指针变量调用函数用指向函数的指针变量调用函数5.1.2 5.1.2 用指向函数的指针变量调用函数用指向函数的指针变量调用函数FFTT图图图图5.1 5.1 5.1 5.1 程序算法描述程序算法描述程序算法描述程序算法描述开始开始n>=1n>=1n%2=0n%2=0fp=f1fp=f1fp=f2fp=f2(*fp)(n)(*fp)(n)调用函数调用函数结束结束输入输入n n值值输出结果输出结果输出数据错误输出数据错误根据以上算法描述写出程序代码如下:根据以上算法描述写出程序代码如下:根据以上算法描述写出程序代码如下:根据以上算法描述写出程序代码如下:#include
组的解、求函数的定积分等组的解、求函数的定积分等组的解、求函数的定积分等n n函数指针的作用函数指针的作用函数指针的作用函数指针的作用 主要在程序的函数之间传递函数,即把一个函数的主要在程序的函数之间传递函数,即把一个函数的主要在程序的函数之间传递函数,即把一个函数的主要在程序的函数之间传递函数,即把一个函数的地址作为参数从一个函数传递到另外一个函数一地址作为参数从一个函数传递到另外一个函数一地址作为参数从一个函数传递到另外一个函数一地址作为参数从一个函数传递到另外一个函数一般主调函数的般主调函数的般主调函数的般主调函数的实参实参实参实参应当是被传递的应当是被传递的应当是被传递的应当是被传递的函数名函数名函数名函数名,而被调,而被调,而被调,而被调函数的函数的函数的函数的形参形参形参形参应该是能接收函数地址的应该是能接收函数地址的应该是能接收函数地址的应该是能接收函数地址的函数指针函数指针函数指针函数指针( ( ( (指向指向指向指向函数的指针变量函数的指针变量函数的指针变量函数的指针变量) ) ) )5.1.3 5.1.3 指向函数的指针变量作函数参数指向函数的指针变量作函数参数 例例例例5-55-55-55-5 利用已有的利用已有的利用已有的利用已有的通用函数通用函数通用函数通用函数按给定条件求定积分。
按给定条件求定积分按给定条件求定积分按给定条件求定积分其中确定精度的等分数从键盘输入其中确定精度的等分数从键盘输入其中确定精度的等分数从键盘输入其中确定精度的等分数从键盘输入 (1)(1)求函数求函数f f1 1(x)=(x)=((1+x)1+x)在区间在区间[0,2][0,2]的定积分的定积分 (2)(2)求函数求函数f f2 2(x)=1/(1+4x(x)=1/(1+4x2 2) )在区间在区间[-1,1][-1,1]的定积分的定积分 求求求求定积分定积分的方法:的方法:的方法:的方法:矩形法、梯形法、辛普生法矩形法、梯形法、辛普生法矩形法、梯形法、辛普生法矩形法、梯形法、辛普生法 以梯形法为例,设计求定积分的通用函数步骤:以梯形法为例,设计求定积分的通用函数步骤:以梯形法为例,设计求定积分的通用函数步骤:以梯形法为例,设计求定积分的通用函数步骤:n n将区间将区间将区间将区间[a,b][a,b][a,b][a,b]划分为划分为划分为划分为n n n n等分等分等分等分,等分数取决于所求,等分数取决于所求,等分数取决于所求,等分数取决于所求精度;精度;精度;精度;n n计算出所有等分点的函数值计算出所有等分点的函数值计算出所有等分点的函数值计算出所有等分点的函数值f(xf(xf(xf(xi i i i) ) ) );;;; n n连接相邻两个等分点的函数值,将所求曲边四连接相邻两个等分点的函数值,将所求曲边四连接相邻两个等分点的函数值,将所求曲边四连接相邻两个等分点的函数值,将所求曲边四边形区域用若干个小的梯形代替边形区域用若干个小的梯形代替边形区域用若干个小的梯形代替边形区域用若干个小的梯形代替; ; ; ; n n按公式求出所有小的梯形面积,然后求和得到按公式求出所有小的梯形面积,然后求和得到按公式求出所有小的梯形面积,然后求和得到按公式求出所有小的梯形面积,然后求和得到曲边四边形面积的近似值;曲边四边形面积的近似值;曲边四边形面积的近似值;曲边四边形面积的近似值;n用求梯形面积的方法计算某区间的定积分用求梯形面积的方法计算某区间的定积分n将将[a,b][a,b]区间区间n n等分等分, ,则梯形的高则梯形的高h=(b-a)/nh=(b-a)/nn求梯形面积的求梯形面积的计算计算公式公式: : S = (f(XS = (f(Xi i)+f(X)+f(Xi+1i+1))*h))*hn在在X X轴除轴除a a、、b b点外,其余点的函数值都加了两点外,其余点的函数值都加了两次,既是一个梯形的上边,又是另一个梯形的次,既是一个梯形的上边,又是另一个梯形的下边;仅有下边;仅有 a a、、b b点的函数值点的函数值f(a)f(a)或或f(b)f(b)只为只为某梯形的上边或下边,故程序特殊处理为:某梯形的上边或下边,故程序特殊处理为: a a和和b b点:点:area=(f(a)+f(b))/2area=(f(a)+f(b))/2 i i取取1 1~~n-1n-1点:点:area=area+f(a+i*h)area=area+f(a+i*h)5.1.3 5.1.3 5.1.3 5.1.3 指向函数的指针变量作函数参数指向函数的指针变量作函数参数指向函数的指针变量作函数参数指向函数的指针变量作函数参数5.1.3 5.1.3 指向函数的指针变量作函数参数指向函数的指针变量作函数参数n n 按梯形法求定积分的通用函数按梯形法求定积分的通用函数按梯形法求定积分的通用函数按梯形法求定积分的通用函数collectcollectcollectcollectdouble collect(double collect(double collect(double collect(double (*p)(float x)double (*p)(float x)double (*p)(float x)double (*p)(float x),float a,float b,int n),float a,float b,int n),float a,float b,int n),float a,float b,int n){int i;{int i;{int i;{int i; float f,h,area; float f,h,area; float f,h,area; float f,h,area; h=(b-a)/n; h=(b-a)/n; h=(b-a)/n; h=(b-a)/n; /*X/*X/*X/*X轴等分区间的长度轴等分区间的长度轴等分区间的长度轴等分区间的长度( ( ( (高高高高)*/)*/)*/)*/ area=((*p)(a)+(*p)(b))/2.0; area=((*p)(a)+(*p)(b))/2.0; area=((*p)(a)+(*p)(b))/2.0; area=((*p)(a)+(*p)(b))/2.0; /*y/*y/*y/*y轴轴轴轴(f(a)+f(b))/2 */(f(a)+f(b))/2 */(f(a)+f(b))/2 */(f(a)+f(b))/2 */ for(i=1;i 作为实参在主调函数中调用求定积分通用函数作为实参在主调函数中调用求定积分通用函数作为实参在主调函数中调用求定积分通用函数调用指针变量所指的函数调用指针变量所指的函数调用指针变量所指的函数调用指针变量所指的函数函数指针为形参函数指针为形参函数指针为形参函数指针为形参#include 如果函数在调用后返回一个指针值定义数据类型如果函数在调用后返回一个指针值定义数据类型如果函数在调用后返回一个指针值定义数据类型如果函数在调用后返回一个指针值((((地址地址地址地址),这种函数称为返回指针值的函数这种函数称为返回指针值的函数这种函数称为返回指针值的函数这种函数称为返回指针值的函数n n返回指针值函数的头定义返回指针值函数的头定义返回指针值函数的头定义返回指针值函数的头定义[<[<[<[<存储类别存储类别存储类别存储类别>] <>] <>] <>] <数据类型数据类型数据类型数据类型> <*> <*> <*> <*函数名函数名函数名函数名>(>(>(>(形式参数表形式参数表形式参数表形式参数表) ) ) )n n注意区别以下定义注意区别以下定义注意区别以下定义注意区别以下定义 float *func(float x,float y)float *func(float x,float y)float *func(float x,float y)float *func(float x,float y) 返回指针值的函数返回指针值的函数返回指针值的函数返回指针值的函数 float (*fper)(float x,float y)float (*fper)(float x,float y)float (*fper)(float x,float y)float (*fper)(float x,float y) 指向函数的指针变量指向函数的指针变量指向函数的指针变量指向函数的指针变量n n返回指针值函数的调用返回指针值函数的调用返回指针值函数的调用返回指针值函数的调用 函数的返回值只能赋给相同数据类型的指针变量。 函数的返回值只能赋给相同数据类型的指针变量函数的返回值只能赋给相同数据类型的指针变量函数的返回值只能赋给相同数据类型的指针变量例例例例5-65-65-65-6 用静态局部变量和返回指针函数求用静态局部变量和返回指针函数求用静态局部变量和返回指针函数求用静态局部变量和返回指针函数求#include 返回指针类型为块,返回该存储块的地址(指针)返回指针类型为块,返回该存储块的地址(指针)返回指针类型为块,返回该存储块的地址(指针)返回指针类型为voidvoidvoidvoid(空类型),程序中应根据需要将它转换为所需的任(空类型),程序中应根据需要将它转换为所需的任(空类型),程序中应根据需要将它转换为所需的任(空类型),程序中应根据需要将它转换为所需的任何类型如果存储器中没有足够的空间分配,即当存储分何类型如果存储器中没有足够的空间分配,即当存储分何类型如果存储器中没有足够的空间分配,即当存储分何类型如果存储器中没有足够的空间分配,即当存储分配失败时返回值为配失败时返回值为配失败时返回值为配失败时返回值为NULLNULLNULLNULLn n存储释放函数存储释放函数存储释放函数存储释放函数freefreefreefree ( ( ( (在头文件在头文件在头文件在头文件stdlib.hstdlib.hstdlib.hstdlib.h中)中)中)中) 原型:原型:原型:原型:void free( void *memblock );void free( void *memblock );void free( void *memblock );void free( void *memblock );功能:释放由指针变量功能:释放由指针变量功能:释放由指针变量功能:释放由指针变量memblockmemblockmemblockmemblock指明首地址,并由指明首地址,并由指明首地址,并由指明首地址,并由mallocmallocmallocmalloc函数函数函数函数动态分配的存储块。 动态分配的存储块动态分配的存储块动态分配的存储块例例例例5-85-85-85-8 使用使用使用使用mallocmallocmallocmalloc和和和和freefreefreefree函数的示例函数的示例函数的示例函数的示例1 1 1 15.2.2 5.2.2 5.2.2 5.2.2 存储分配标准库函数和动态变量存储分配标准库函数和动态变量存储分配标准库函数和动态变量存储分配标准库函数和动态变量使用使用使用使用mallocmallocmallocmalloc和和和和freefreefreefree函数的示例函数的示例函数的示例函数的示例2 2 2 2#include
