【C语言】第八章指针5课件_第1页
【C语言】第八章指针5课件_第2页
【C语言】第八章指针5课件_第3页
【C语言】第八章指针5课件_第4页
【C语言】第八章指针5课件_第5页
已阅读5页,还剩67页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、【C语言】第八章指针5【C语言】第八章指针58.5 指向函数的指针1.指向函数的指针变量的定义2.返回指针值的函数3.用指向函数的指针作函数参数8.5 指向函数的指针1.指向函数的指针变量的定义1指向函数的指针变量的定义函数的指针:一个函数占用一段内存单元, 这段内存单元的起始地址称为函数的指针,用一指针变量指向函数,然后通过该指针变量可以实现函数调用。1指向函数的指针变量的定义函数的指针:一个函数占用一段内存单定义一个指向函数的指针变量:类型标识符 (*指针变量名)( 形参表列) ;例如: int (*p)(int,int); 定义p是指向函数的指针变量,它可以指向类型为整型且有两个整型参数

2、的函数。p的类型用int (*)(int,int)表示函数返回值类型1指向函数的指针变量的定义定义一个指向函数的指针变量:函数返回值类型1指向函数的指针变int (*p)(int,int);不能写成int *p(int,int) 因为()的优先级高于*,后者表示p是一个函数,返回值为指向整型变量的指针。1指向函数的指针变量的定义int (*p)(int,int);不能写成1指向函数的指针例8.22 用函数求整数a和b中的大者。解题思路:定义一个函数max,实现求两个整数中的大者。在主函数调用max函数,除了可以通过函数名调用外,还可以通过指向函数的指针变量来实现。分别编程并作比较。示例例8.2

3、2 用函数求整数a和b中的大者。示例(1)通过函数名调用函数#include int main() int max(int,int); int a,b,c; printf(please enter a and b:); scanf(%d,%d,&a,&b); c=max(a,b); printf(“%d,%d,max=%dn,a,b,c); return 0;int max(int x,int y) int z; if(xy) z=x; else z=y; return(z);(1)通过函数名调用函数int max(int x,int (2)通过指针变量访问它所指向的函数#include in

4、t main() int max(int,int); int (*p)(int,int); int a,b,c; p=max; printf(please enter a and b:); scanf(%d,%d,&a,&b); c=(*p)(a,b); printf(“%d,%d,max=%dn,a,b,c); return 0;必须先指向,若写成p=max(a,b); 错只能指向函数返回值为整型且有两个整型参数的函数(2)通过指针变量访问它所指向的函数必须先指向,若写成只能指总结:1. 函数的调用可以通过函数名调用,也可以通过函数指针调用。2. (*p)( )表示定义一个指向函数的指针变量

5、,它不是固定指向哪一个函数的,它是专门用来存放函数的入口地址的。3. 函数名代表该函数的入口地址,因此p=max表示p指向函数max的入口。4. 用函数指针变量调用函数时,只需用(*p)代替函数名即可。5. p+n,p+,p-等运算无意义总结: 例8.23 输入两个整数,然后让用户选择1或2,选1时调用max函数,输出二者中的大数,选2时调用min函数,输出二者中的小数。解题思路:定义两个函数max和min,分别用来求大数和小数。在主函数中根据用户输入的数字1或2,使指针变量指向max函数或min函数。 例8.23 输入两个整数,然后让用户选择1或2,选1时#include int main(

6、)int max(int,int); int min(int x,int y); int (*p)(int,int); int a,b,c,n; scanf(%d,%d,&a,&b); scanf(“%d”,&n); if (n=1) p=max; else if (n=2) p=min; c=(*p)(a,b); printf(a=%d,b=%dn,a,b); if (n=1) printf(max=%dn,c); else printf(min=%dn,c); return 0;只看此行看不出调用哪函数#include 只看此行看不出调用哪函数int max(int x,int y) in

7、t z; if(xy) z=x; else z=y; return(z);int min(int x,int y) int z; if(xy) z=x; else z=y; return(z);int max(int x,int y)2.返回指针值的函数定义返回指针值的函数的一般形式为 类型名 *函数名(参数表列) 函数体 例如 int * fun( ); fun 是函数名, 调用它以后能得到一个指向整型数据的指针(地址)。2.返回指针值的函数定义返回指针值的函数的一般形式为 例8.25有a个学生,每个学生有b门课程的成绩。要求在用户输入学生序号以后,能输出该学生的全部成绩。用指针函数实现。

8、例8.25有a个学生,每个学生有b门课程的成绩。要求在用 解题思路:定义二维数组score存放成绩定义输出某学生全部成绩的函数search,它是返回指针的函数,形参是行指针和整型主函数将score和要找的学号k传递给形参函数的返回值是&scorek0(k号学生的序号为0的课程地址)在主函数中输出该生的全部成绩 解题思路:#include int main()float score 4=60,70,80,90, 56,89,67,88,34,78,90,66; float *search(float (*pointer)4,int n); float *p; int i,k; scanf(“%d

9、”,&k); printf(The scores of No.%d are:n,k); p=search(score,k); for(i=0;i4;i+) printf(“%5.2ft”,*(p+i); printf(n); return 0;返回k号学生课程首地址float *search(float (*pointer)4,int n) float *pt; pt=*(pointer+n); return(pt);#include 返回k号学生课程首地址ffloat *search(float (*pointer)4,int n) float *pt; pt=*(pointer+n); r

10、eturn(pt);float *search(float (*pointer) 例8.26对例8.25中的学生,找出其中有不及格的课程的学生及其学生号。(课下自己看) 例8.26对例8.25中的学生,找出其中有不及格的课程的3.用指向函数的指针作函数参数指向函数的指针变量的一个重要用途是把函数的地址作为参数传递到其他函数指向函数的指针可以作为函数参数,把函数的入口地址传递给形参,这样就能够在被调用的函数中使用实参函数3.用指向函数的指针作函数参数指向函数的指针变量的一个重要用3.用指向函数的指针作函数参数int main() fun(f1,f2) void fun(int (*x1)(int

11、),int (*x2)(int,int) int a,b,i=3,j=5; a=(*x1)(i); b=(*x2)(i,j); 相当于a=f1(i);相当于b=f2(i,j);3.用指向函数的指针作函数参数相当于a=f1(i);相当 例8.24 有两个整数a和b,由用户输入1,2或3。如输入1,程序就给出a和b中大者,输入2,就给出a和b中小者,输入3,则求a与b之和。 解题思路:与例8.23相似,但现在用一个函数fun来实现以上功能。 例8.24 有两个整数a和b,由用户输入1,2或3。如#include int main()void fun(int x,int y, int (*p)(in

12、t,int); int max(int,int); int min(int,int); int add(int,int); int a=34,b=-21,n; printf(please choose 1,2 or 3:); scanf(“%d”,&n); if (n=1) fun(a,b,max); else if (n=2) fun(a,b,min); else if (n=3) fun(a,b,add); return 0; #include int fun(int x,int y,int (*p)(int,int) int resout; resout=(*p)(x,y); print

13、f(“%dn”,resout); int max(int x,int y) int z; if(xy) z=x; else z=y; printf(max= ); return(z); 输入的选项为1时相当于max(x,y)int fun(int x,int y,int (*p)(iint fun(int x,int y,int (*p)(int,int) int resout; resout=(*p)(x,y); printf(“%dn”,resout); int max(int x,int y) int z; if(xy) z=x; else z=y; printf(max= ); ret

14、urn(z); 输入的选项为2时相当于min(x,y)int fun(int x,int y,int (*p)(iint fun(int x,int y,int (*p)(int,int) int result; result=(*p)(x,y); printf(“%dn”,result); int max(int x,int y) int z; if(xy) z=x; else z=y; printf(max= ); return(z); 输入的选项为3时相当于add(x,y)int fun(int x,int y,int (*p)(iint min(int x,int y) int z;

15、if(xy) z=x; else z=y; printf(min=); return(z); int add(int x,int y) int z; z=x+y; printf(sum=); return(z); int min(int x,int y) 8.6 指针数组和多重指针1 什么是指针数组2 指向指针数据的指针8.6 指针数组和多重指针1 什么是指针数组1 什么是指针数组概念:一个数组,其元素均为指针类型数据,称为指针数组。定义一维指针数组的一般形式为 类型名*数组名数组长度; int *p4;1 什么是指针数组概念:一个数组,其元素均为指针类型数据,称例: int a=1 , b=

16、2 , c=3 , d=4 ; int * p4 ; p0=&a; p1=&b; p2=&c; p3=&d;P指针数组&a&b&c&dP0P1P2P3*p0等价于a例:P&a&b&c&dP0P1P2P3*p1. 什么是指针数组指针数组比较适合用来指向若干个字符串,使字符串处理更加方便灵活可以分别定义一些字符串,然后用指针数组中的元素分别指向各字符串由于各字符串长度一般是不相等的,所以比用二维数组节省内存单元1. 什么是指针数组指针数组比较适合用来指向若干个字符串,使 例8.27 将若干字符串按字母顺序(由小到大)输出。FollowGreatFORTRANComputer要考虑的问题:1.数据的

17、存储方式(普通变量,数组,常量)2.排序算法 例8.27 将若干字符串按字母顺序(由小到大)输出。F1.普通变量char s1,s2; s1=F;s2=o 2.一维数组 char s1=“Follow”; char s2=“Computer”;s3;s4=;3.二维数组char s17=“Follow”,“Great”,“FORTRAN”,“Computer”4.常量存储字符串4个指向字符串的指针变量char *p1=“Follow”;*p2=“Great”;*p3=,*p4;5.常量存储字符串一个指向字符串的指针数组char *p=“Follow”,“Great”,“FORTRAN”,“Co

18、mputer”1.普通变量#include #include int main()void sort(char *name ,int n); void print(char *name ,int n); char *name =“Follow”,“Great”, “FORTRAN”,“Computer”; int n=4; sort(name,n); print(name,n); return 0;Follow0Great0FORTRAN0Computer0#include Follow0Greavoid sort(char *name ,int n) char *temp; int i,j,

19、k; for (i=0;in-1;i+) k=i; for (j=i+1;j0) k=j; if (k!=i) temp=namei; namei=namek; namek=temp; Follow0Great0FORTRAN0Computer0name0name1name2name3void sort(char *name ,int n)void sort(char *name ,int n) char *temp; int i,j,k; for (i=0;in-1;i+) k=i; for (j=i+1;j0) k=j; if (k!=i) temp=namei; namei=namek;

20、 namek=temp; Follow0Great0FORTRAN0Computer0name0name1name2name3i=0时执行后k变为3void sort(char *name ,int n)void sort(char *name ,int n) char *temp; int i,j,k; for (i=0;in-1;i+) k=i; for (j=i+1;j0) k=j; if (k!=i) temp=namei; namei=namek; namek=temp; Follow0Great0FORTRAN0Computer0name0name1name2name3void s

21、ort(char *name ,int n)void sort(char *name ,int n) char *temp; int i,j,k; for (i=0;in-1;i+) k=i; for (j=i+1;j0) k=j; if (k!=i) temp=namei; namei=namek; namek=temp; Follow0Great0FORTRAN0Computer0name0name1name2name3i=1时执行后k变为2void sort(char *name ,int n)void sort(char *name ,int n) char *temp; int i,

22、j,k; for (i=0;in-1;i+) k=i; for (j=i+1;j0) k=j; if (k!=i) temp=namei; namei=namek; namek=temp; Follow0Great0FORTRAN0Computer0name0name1name2name3void sort(char *name ,int n)void sort(char *name ,int n) char *temp; int i,j,k; for (i=0;in-1;i+) k=i; for (j=i+1;j0) k=j; if (k!=i) temp=namei; namei=name

23、k; namek=temp; Follow0Great0FORTRAN0Computer0name0name1name2name3i=2时执行后k变为3void sort(char *name ,int n)void sort(char *name ,int n) char *temp; int i,j,k; for (i=0;in-1;i+) k=i; for (j=i+1;j0) k=j; if (k!=i) temp=namei; namei=namek; namek=temp; Follow0Great0FORTRAN0Computer0name0name1name2name3void

24、 sort(char *name ,int n)void sort(char *name ,int n) char *temp; int i,j,k; for (i=0;in-1;i+) k=i; for (j=i+1;j0) k=j; if (k!=i) temp=namei; namei=namek; namek=temp; Follow0Great0FORTRAN0Computer0name0name1name2name3void sort(char *name ,int n)void sort(char *name ,int n) char *temp; int i,j,k; for

25、(i=0;in-1;i+) k=i; for (j=i+1;j0) k=j; if (k!=i) temp=namei; namei=namek; namek=temp; Follow0Great0FORTRAN0Computer0name0name1name2name3void sort(char *name ,int n)void print(char *name ,int n) int i; for(i=0;in;i+) printf(“%sn”,namei); Follow0Great0FORTRAN0Computer0name0name1name2name3void print(ch

26、ar *name ,int nvoid print(char *name ,int n) int i; for(i=0;in;i+) printf(“%sn”,namei); void print(char *name ,int n) int i=0; char *p; p=name0; while(in) p=*(name+i+); printf(%sn,p); void print(char *name ,int n2. 指向指针数据的指针在了解了指针数组的基础上,需要了解指向指针数据的指针变量,简称为指向指针的指针。2. 指向指针数据的指针在了解了指针数组的基础上,需要了解指 int a

27、=3 ; int *p1 ; int *p2 ; p1=&a ; p2=&p1 ;p2&p1p1&aa3问题:如何通过指针p2改变a的值,改为5答案:*p2=5例8.28、例8.29自己课下看 int a=3 ;p2&p1p1&aa3问8.6.3 指针数组作main函数的形参指针数组的一个重要应用是作为main函数的形参。在以往的程序中,main函数的第一行一般写成以下形式: int main() 或 int main(void)表示main函数没有参数,调用main函数时不必给出实参。这是一般程序常采用的形式。8.6.3 指针数组作main函数的形参指针数组的一个重要应8.7.3 指针数组作

28、main函数的形参实际上,在某些情况下,main函数可以有参数,例如: int main(int argc,char *argv) 其中,argc和argv就是main函数的形参,它们是程序的“命令行参数”。argv是*char指针数组,数组中每一个元素(其值为指针)指向命令行中的一个字符串。8.7.3 指针数组作main函数的形参实际上,在某些情况下8.7.3 指针数组作main函数的形参通常main函数和其他函数组成一个文件模块,有一个文件名。对这个文件进行编译和连接,得到可执行文件(后缀为.exe)。用户执行这个可执行文件,操作系统就调用main函数,然后由main函数调用其他函数,从而

29、完成程序的功能。8.7.3 指针数组作main函数的形参通常main函数和其8.7.3 指针数组作main函数的形参main函数的形参是从哪里传递给它们的呢?显然形参的值不可能在程序中得到。main函数是操作系统调用的,实参只能由操作系统给出。8.7.3 指针数组作main函数的形参main函数的形参是#include int main(int argc,char *argv) while(argc1) +argv; printf(“%sn”, *argv); -argc; return 0;在VC+环境下编译、连接后,“工程”“设置”“调试”“程序变量”中输入“China Beijing”,

30、再运行就可得到结果#include 在VC+环境下编译、连8.7 动态内存分配与指向它的指针变量1. 什么是内存的动态分配2. 怎样建立内存的动态分配3. void指针类型8.7 动态内存分配与指向它的指针变量1. 什么是内存的动态1. 什么是内存的动态分配非静态的局部变量是分配在内存中的动态存储区的,这个存储区是一个称为栈的区域C语言还允许建立内存动态分配区域,以存放一些临时用的数据,这些数据需要时随时开辟,不需要时随时释放。这些数据是临时存放在一个特别的自由存储区,称为堆区1. 什么是内存的动态分配非静态的局部变量是分配在内存中的动2. 怎样建立内存的动态分配对内存的动态分配是通过系统提供

31、的库函数来实现的,主要有malloc,calloc,free,realloc这4个函数。2. 怎样建立内存的动态分配对内存的动态分配是通过系统提供的2. 怎样建立内存的动态分配malloc函数其函数原型为 void *malloc(unsigned int size); 其作用是在内存的动态存储区中分配一个长度为size的连续空间函数的值是所分配区域的第一个字节的地址,或者说,此函数是一个指针型函数,返回的指针指向该分配域的开头位置2. 怎样建立内存的动态分配malloc函数2. 怎样建立内存的动态分配 malloc(100);开辟100字节的临时分配域,函数值为其第1个字节的地址 注意指针的

32、基类型为void,即不指向任何类型的数据,只提供一个地址如果此函数未能成功地执行(例如内存空间不足),则返回空指针(NULL)2. 怎样建立内存的动态分配 malloc(100)2. 怎样建立内存的动态分配2calloc函数其函数原型为 void *calloc(unsigned n,unsigned size); 其作用是在内存的动态存储区中分配n个长度为size的连续空间,这个空间一般比较大,足以保存一个数组。2. 怎样建立内存的动态分配2calloc函数用calloc函数可以为一维数组开辟动态存储空间,n为数组元素个数,每个元素长度为size。这就是动态数组。函数返回指向所分配域的起始位

33、置的指针;如果分配不成功,返回NULL。如: p=calloc(50,4); 开辟504个字节的临时分配域,把起始地址赋给指针变量p 2. 怎样建立内存的动态分配用calloc函数可以为一维数组开辟动态存储空间,n为数组元3free函数其函数原型为 void free(void *p); 其作用是释放指针变量所指向的动态空间,使这部分空间能重新被其他变量使用。p应是最近一次调用calloc或malloc函数时得到的函数返回值。2. 怎样建立内存的动态分配3free函数2. 怎样建立内存的动态分配 free(p);释放指针变量所指向的已分配的动态空间 free函数无返回值2. 怎样建立内存的动态

34、分配 free(p);2. 怎样建立内存的动态分配4. realloc函数其函数原型为void *realloc(void *p,unsigned int size);如果已经通过malloc函数或calloc函数获得了动态空间,想改变其大小,可以用recalloc函数重新分配。2. 怎样建立内存的动态分配4. realloc函数2. 怎样建立内存的动态分配用realloc函数将p所指向的动态空间的大小改变为size。p的值不变。如果重分配不成功,返回NULL。如 realloc(p,50); 将p所指向的已分配的动态空间改为50字节 2. 怎样建立内存的动态分配用realloc函数将p所指向

35、的动态空间的大小改变为size以上4个函数的声明在stdlib.h头文件中,在用到这些函数时应当用“#include ”指令把stdlib.h头文件包含到程序文件中。2. 怎样建立内存的动态分配以上4个函数的声明在stdlib.h头文件中,在用到这些函数3. void指针类型 void *p;定义了一个基类型为void的指针变量,它不指向任何类型的数据或指向空类型。int *p1;a=5;p1&a;printf(“%dn”,*p1);p=(void *)p1;printf(“%dn”,*p); 错3. void指针类型 void *p;3. void指针类型 例8.30 建立动态数组,输入5个学生的成绩,另外用一个函放数检查其中有无低于60分的,输出不合格的成绩。(课下自己看)3. void指针类型 例8.30 建立动态数组,输入5个 解题思路:用malloc函数开辟一个动态自由区域,用来存5个学生的成绩,会得到这个动态域第一个字节的地址,它的基类型是void型。用一个基类型为int的指针变量p来指向动态数组的各元素,并输出它们的值。但必须先把ma

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论