共31张1§8.5函数的指针和指向函数的指针变量函数指针:函数在编译时被分配的入口地址,用函数名表示max…...指令1指令2函数指针变量赋值:如p=max;函数返回值的数据类型专门存放函数入口地址可指向返回值类型相同的不同函数指向函数的指针变量定义形式:数据类型(*指针变量名)();如int(*p)();函数指针变量指向的函数必须有函数说明函数调用形式:c=max(a,b);c=(*p)(a,b);c=p(a,b);对函数指针变量pn,p++,p--无意义()不能省int(*p)()与int*p()不同共31张2例用函数指针变量调用函数,比较两个数大小main(){intmax(int,int);inta,b,c;scanf(%d,%d,&a,&b);c=max(a,b);printf(a=%d,b=%d,max=%d\n,a,b,c);}intmax(intx,inty){intz;if(xy)z=x;elsez=y;return(z);}main(){intmax(int,int),(*p)();inta,b,c;p=max;scanf(%d,%d,&a,&b);c=(*p)(a,b);printf(a=%d,b=%d,max=%d\n,a,b,c);}intmax(intx,inty){intz;if(xy)z=x;elsez=y;return(z);}共31张3用函数指针变量作函数参数例用函数指针变量作参数,求最大值、最小值和两数之和voidmain(){inta,b,max(int,int),min(int,int),add(int,int);voidprocess(int,int,int(*fun)());scanf(%d,%d,&a,&b);process(a,b,max);process(a,b,min);process(a,b,add);}voidprocess(intx,inty,int(*fun)()){intresult;result=(*fun)(x,y);printf(%d\n,result);}max(intx,inty){printf(“max=”);return(xy?x:y);}min(intx,inty){printf(“min=”);return(xy?x:y);}add(intx,inty){printf(“sum=”);return(x+y);}共31张4§8.6返回指针值的函数函数定义形式:类型标识符*函数名(参数表);例int*f(intx,inty)例指针函数实现:有若干学生成绩,要求输入学生序号后,能输出其全部成绩main(){floatscore[][4]={{60,70,80,90},{56,89,67,88},{34,78,90,66}};float*search(float(*pointer)[4],intn),*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));}float*search(float(*pointer)[4],intn){float*pt;pt=*(pointer+n);return(pt);}pointerpointer+1347890665689678860708090score数组pppp共31张5例写一个函数,求两个int型变量中居于较大值的变量的地址int*f1(int*x,int*y){if(*x*y)returnx;elsereturny;}main(){inta=2,b=3;int*p;p=f1(&a,&b);printf(%d\n,*p);}…...20002010201420042008200C23指针变量y指针变量x(f1)20042000COPY变量a变量b(main)指针变量p**共31张6例写一个函数,求两个int型变量中居于较大值的变量的地址…...…...20002010201420042008200C2变量a变量b(main)3指针变量p**2004int*f3(int*x,int*y){if(*x*y)returnx;elsereturny;}main(){inta=2,b=3;int*p;p=f1(&a,&b);printf(%d\n,*p);}共31张7例写一个函数,求两个int型变量中居于较大值的变量的地址int*f3(intx,inty){if(xy)return&x;elsereturn&y;}main(){inta=2,b=3;int*p;p=f3(a,b);printf(%d\n,*p);}…...20002010201420042008200C23变量y变量x(f3)32COPY变量a变量b(main)指针变量p**共31张8例写一个函数,求两个int型变量中居于较大值的变量的地址不能返回形参或局部变量的地址作函数返回值…...…...20002010201420042008200C2变量a变量b(main)3指针变量p**2010int*f3(intx,inty){if(xy)return&x;elsereturn&y;}main(){inta=2,b=3;int*p;p=f3(a,b);printf(%d\n,*p);}共31张9§8.7指针数组和指向指针的指针用于处理二维数组或多个字符串指针数组定义:数组中的元素为指针变量定义形式:[存储类型]数据类型*数组名[数组长度说明];例int*p[4];指针所指向变量的数据类型指针本身的存储类型区分int*p[4]与int(*p)[4]指针数组赋值与初始化赋值:main(){intb[2][3],*pb[2];pb[0]=b[0];pb[1]=b[1];……..}int*pb[2]pb[0]pb[1]intb[2][3]123246初始化:main(){intb[2][3],*pb[]={b[0],b[1]};……..}int*pb[2]pb[0]pb[1]intb[2][3]123246共31张10指针数组赋值与初始化Lisp\0Fortran\0Basic\0p[0]p[1]p[2]p[3]0赋值:main(){chara[]=Fortran;charb[]=Lisp;charc[]=Basic;char*p[4];p[0]=a;p[1]=b;p[2]=c;p[3]=NULL;……..}或:main(){char*p[4];p[0]=Fortran;p[1]=Lisp;p[2]=Basic;p[3]=NULL;……..}初始化:main(){char*p[]={Fortran,Lisp,Basic,NULL};……..}Lisp\0Fortran\0Basic\0p[0]p[1]p[2]p[3]0共31张11charname[5][9]={“gain”,“much”,“stronger”,“point”,“bye”};char*name[5]={“gain”,“much”,“stronger”,“point”,“bye”};gain\0stronger\0point\0much\0name[0]name[1]name[2]name[3]name[4]bye\0gain\0stronger\0point\0much\0bye\0二维数组与指针数组区别:二维数组存储空间固定字符指针数组相当于可变列长的二维数组分配内存单元=数组维数*2+各字符串长度指针数组元素的作用相当于二维数组的行名但指针数组中元素是指针变量二维数组的行名是地址常量共31张12main(){intb[2][3],*pb[2];inti,j;for(i=0;i2;i++)for(j=0;j3;j++)b[i][j]=(i+1)*(j+1);pb[0]=b[0];pb[1]=b[1];for(i=0;i2;i++)for(j=0;j3;j++,pb[i]++)printf(b[%d][%d]:%2d\n,i,j,*pb[i]);}例用指针数组处理二维数组int*pb[2]pb[0]pb[1]intb[2][3]b[0][0]*pb[0]b[0][1]*(pb[0]+1)b[0][2]*(pb[0]+2)b[1][0]*pb[1]b[1][1]*(pb[1]+1)b[1][2]*(pb[1]+2)123246共31张13例对字符串排序(简单选择排序)main(){voidsort(char*name[],intn),print(char*name[],intn);char*name[]={Followme,BASIC,GreatWall,FORTRAN,Computer};intn=5;sort(name,n);print(name,n);}voidsort(char*name[],intn){char*temp;inti,j,k;for(i=0;in-1;i++){k=i;for(j=i+1;jn;j++)if(strcmp(name[k],name[j])0)k=j;if(k!=i){temp=name[i];name[i]=name[k];name[k]=temp;}}}name[0]name[1]name[2]name[3]name[4]nameGreatWallFORTRANComputerFollowmeBASICkjkjjji=0共31张14例对字符串排序(简单选择排序)main(){voidsort(char*name[],intn),print(char*name[],intn);char*name[]={Followme,BASIC,GreatWall,FORTRAN,Computer};intn=5;sort(name,n);print(name,n);}voidsort(char*name[],intn){char*temp;inti,j,k;for(i=0;in-1;i++){k=i;for(j=i+1;jn;j++)if(strcmp(name[k],name[j])0)k=j;if(k!=i){temp=name[i];name[i]=name[k];name[k]=temp;}}}name[0]name[1]name[2]name[3]name[4]nameGreatWallFORTRANComputerFollowmeBASICkkjjji=1k共31张15例对字符串排序(简单选择排序)main(){voidsort(char*name[],intn),print(char*name[],intn);char*name[]={Followme,BASIC,GreatWall,FORTRAN,Computer};intn=5;sort(name,n);print(name,n);}voidsort(char*name[],intn){char*temp;inti,j,k;for(i=0;in-1;i++){k=i;for(j=i+1;jn;j++)if(strcmp(name[k],name[j])0)k=j;if(k!=i){temp=name[i];name[i]=name[k];name[k]=temp;}}}name[0]name[1]name[2]name[3]name[4]nameGreatWallFORTRANComputerFollowmeBASICkkjji=2共31张16例对字符串排序(简单选择排序)main(){voidsort(char*name[],intn),print(char*name[],intn);char*name[]={Followme,BASIC,GreatWall,FORTRAN,C