您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 公司方案 > C语言-ch08-5-函数指针与指针函数
2020/3/41上一节我们学到了字符串的引用方式字符数组字符指针constchar*p=Hello;字符指针作函数参数使用字符指针变量和字符数组的比较2020/3/42第8章善于利用指针8.1指针是什么8.2指针变量8.3通过指针引用数组8.4通过指针引用字符串8.5指向函数的指针8.6返回指针值的函数8.7指针数组和多重指针8.8动态内存分配与指向它的指针变量8.9有关指针的小结2020/3/43指向函数的指针简称为函数指针,functionpointerint(*p)(int,int);p可以指向任何“有两个整型形参且返回整型值”的函数编译时,编译系统为每个函数源码分配一段存储空间,这段存储空间的起始地址(又称入口地址)称为这个函数的指针。2020/3/44函数指针intmax(intx,inty){return(xy)?x:y;}intmain(){inta=1,b=2,c=0;//printf(“%p\n”,max);//输出函数地址int(*p)(intx,inty);//定义一个指向函数的指针p=max;//将函数max的起始地址赋给函数指针pc=(*p)(a,b);//用指针形式实现函数的调用max(a,b)printf(a=%d,b=%d,max=%d,a,b,c);}2020/3/45将main函数改写为:intmain(){inta=1,b=2,c=0;//printf(“%p\n”,max);//输出函数地址int(*p)(intx,inty);//定义一个指向函数的指针p=max;//将函数max的起始地址赋给函数指针pc=(*p)(a,b);//用指针形式实现函数的调用printf(a=%d,b=%d,max=%d,a,b,c);}stdlib.h的qsort函数尽量用库函数,效率高voidqsort(void*base,size_tnmemb,size_tsize,int(*compar)(constvoid*,constvoid*));参数base:指向数组首元素的指针nmemb:元素个数size:元素大小compar:指向比较两个元素的函数,需程序员自己定义比较函数必须返回小于0,等于0或大于02020/3/46qsort可对不同类型数组排序整型数组排序double型数组排序字符串数组排序结构体数组排序2020/3/47整型数组排序#includestdio.h#includestdlib.hintintcmp(constvoid*a,constvoid*b){return(*(int*)a-*(int*)b);}intmain(){inti;intints[6]={40,10,100,90,20,25};qsort(ints,6,sizeof(ints[0]),intcmp);for(i=0;i6;++i)printf(%d,ints[i]);printf(\n);return0;}8double数组排序#includestdio.h#includestdlib.hintdoublecmp(constvoid*a,constvoid*b){return(*(double*)a*(double*)b)?1:-1;}intmain(){inti;doubledoubles[4]={2.1,3.0,2.0,2.4};qsort(doubles,6,sizeof(doubles[0]),doublecmp);for(i=0;i4;++i)printf(%d,doubles[i]);printf(\n);return0;}9字符串数组排序#includestdio.h#includestdlib.h#includestring.hintstringcmp(constvoid*a,constvoid*b){returnstrcmp(*(char*)a,*(char*)b);}intmain(){inti;intstrings[4][20]={some,example,strings,here};qsort(strings,4,sizeof(strings[0]),stringcmp);for(i=0;i6;++i)printf(%d,strings[i]);printf(\n);return0;}102020/3/4118.6返回指针值的函数int(*p)(intx,inty);//p是指向函数的指针int*p(intx,inty);//p是返回指针的函数2020/3/412例8.25有若干个学生的成绩(每个学生有4门课程),要求在用户输入学生序号以后,能输出该学生的全部成绩。用指针函数来实现。intmain(){floatscore[][4]={{60,70,80,90},{56,89,67,88},{34,78,90,66}};float*p;inti,m;printf(enterthenumberofstudent:);scanf(%d,&m);printf(ThescoresofNo.%dare:\n,m);p=search(score,m);for(i=0;i4;i++)printf(%5.2f\t,*(p+i));}2020/3/413float*search(float(*pointer)[4],intn){float*pt;pt=*(pointer+n);returnpt;}运行情况如下:enterthenumberofstudent:1ThescoresofNo.1are:56.0089.0067.0088.002020/3/414请注意,指针变量p、pt和pointer的区别。如果将search函数中的语句:pt=*(pointer+n);改为:pt=(*pointer+n);运行结果为:enterthenumberofstudent:1ThescoresofNo.1are:70.0080.0090.0056.00得到的不是第一个学生的成绩,而是二维数组中a[0][1]开始的4个元素的值。为什么?请分析。2020/3/415例8.26对上例中的学生,找出其中有不及格课程的学生及其学生号。intmain(){floatscore[][4]={{60,70,80,90},{56,89,67,88},{34,78,90,66}};float*p;inti,j;for(i=0;i3;i++){//调用search函数,如有不及格返回score[i][0]的地址,否则返回NULLp=search(score+i);if(p==*(score+i)){printf(No.%dscores:,i);for(j=0;j4;j++)printf(%5.2f,*(p+j));printf(\n);}}}2020/3/416float*search(float(*pointer)[4]){inti=0;float*pt=NULL;for(;i4;i++){//如果有不及格课程,使pt指向score[i][0]if(*(*pointer+i)60){pt=*pointer;break;}}returnpt;}2020/3/417程序运行结果为No.1scores:50.0089.0067.0088.00No.2scores:34.0078.0090.0066.002020/3/418在search函数中,先使pt=*(pointer+1),即把pt指向本行之末尾。这是为了区分有无不及格课程的标志。若经检查4门课中有不及格的,就使pt指向本行第0列元素。若无不及格则保持pt指向本行末尾(亦即下一行第0列元素)。将pt返回main函数。在main函数中,把调用search得到的函数值(指针变量pt的值),赋给p。用if语句判断p是否等于*(score+i),若相等,表示所查的学生有不及格课程(p的值为*(score+i),即p指向第i行的第0列元素)。若无不及格,p的值是*(score+i+1),因为在函数search中已使它指向本行的末尾,也就是下一行开头。如果p等于*(score+i),就输出该学生(有不及格课程的学生)4门课成绩。2020/3/419指针做返回值int*foo(void){inta=100;return&a;}永远不要把局部变量的地址作为返回值返回这是极端错误的!!!指针做返回值printf(%s,GetInput());......char*GetInput(void){charstr[100];scanf(%s,str);returnstr;}charstring[30];printf(%s,GetInput(string));......char*GetInput(char*str){scanf(%s,str);returnstr;}20√2020/3/421这一节我们学到了函数指针和指针函数
本文标题:C语言-ch08-5-函数指针与指针函数
链接地址:https://www.777doc.com/doc-4128322 .html