函数指针

来源:互联网 发布:navicat for linux 64 编辑:程序博客网 时间:2024/06/15 08:02

函数指针:即指向函数的指针

1.求两个整形数据的最大值,最小值,平均值

#include<stdio.h>

int Max(int a,int b)

return a>b ? a : b;

}

int Min(int a,int b)

return a

}

int Avg(int a,int b)

return (a+b) / 2;

}

void Show(int a)

printf("%d\n",a);

}

int main()

int (*p)(int,int);//指向函数的指针,指向函数族

 p = Max;

 p = Min; 

p = Avg;

 //p = Show; //error,p为函数指针,指向一个有两个整形的参数和一个整形作为返回值

printf("%d\n",p(10,20));

 return 0;

}

该函数缺点:相似的代码被重复写

2.交换不同类型的两个数​

#include<stdio.h>

#include<stdlib.h>

#include<memery.h> //内存拷贝所需头文件​

//C语言不支持函数名重载(名字不能使用多次),原因它只在函数名前加_

//C++支持函数重载,要求参数列表不一样,因为它生成的符号会根据参数列表产生

void Swap_int(int *p1,int *p2)

int tmp = *p1; 

*p1 = *p2; 

*p2 = tmp;

}

void Swap_short(short *p1,short *p2)

short tmp = *p1;

 *p1 = *p2; 

*p2 = tmp;

}

void Swap_float(float *p1,float *p2)

float tmp = *p1; 

*p1 = *p2; 

*p2 = tmp;

}

//void 表示没有

//size,需要交换的数据字节数

void Swap(void *vp1,void *vp2,int size)//泛型编程,通用编程

{

 void *tmp = malloc(size); 

memcpy(tmp,vp1,size); 

memcpy(vp1,vp2,size);

 memcpy(vp2,tmp,size); 

free(tmp); 

}

//int Max(int a,int b);

//float Max(float a,float b);

//void *:通用指针或泛型指针,用于存储地址值,不能解引用也不能进行算术运算+1,

//显示说明参数列表为空

int main(void)

int a = 10; 

int b = 20; 

Swap(&a,&b,sizeof(int)); 

//Swap_int(&a,&b); 

printf("%d,%d\n",a,b);

 short c = 30; 

short d = 40; 

//Swap_short(&c,&d);

 Swap(&c,&d,sizeof(short));

 printf("%d,%d\n",c,d);

 return 0;

}

3.查找不同类型数组中的数据(回调函数)

#include<stdio.h>

#include<stdlib.h>

#include<string.h>


typedef int (*PCmp)(void*,void*);//定义了一个新的数据类型 ,PCmp为函数指针,指向形                                                      //参为两个void *,返回为int类型的一类函数

//定义学生类

typedef struct Student

char name[20]; 

int score;

}Student;

//arr,数组首地址

//len,数组长度

//elemsize,单元字节

//pkey,关键字地址

int Search(void *arr,void *pkey,int elemsize,int len,PCmp pfun)

void *base; 

for(int i=0;i

{  

base = (char *)arr+i*elemsize;  

//if(memcmp(base,pkey,elemsize) == 0)  

//如果相等,表示找到了,返回下标,否则返回-1

//arr[i]==*(arr+i)  

if(pfun(base,pkey) == 0)//回调函数  

{   

return i; 

 }

 }

 return -1;

}

//int Cmp_int(int *a,int* b)

int Cmp_int(void*vp1,void*vp2)

return *(int *)vp1 - *(int*)vp2;

}

#define EPS 0.000001

int Cmp_double(void *vp1,void *vp2)

{

 double tmp = *(double *)vp1 - *(double *)vp2;  //3.9-3.2

 if(tmp < -EPS)

 {  

return -1;

 }

 else if(tmp > EPS) 

{  

return 1; 

else 

 return 0;

 }

}

int Cmp_str(void *vp1,void*vp2)

return strcmp(*(char**)vp1,(char *)vp2);

 //return strcmp(*(char**)vp1,*(char **)vp2);

}

int Cmp_stu_name(void *vp1,void *vp2)

{

//Student*,char* 

return strcmp(((Student *)vp1)->name,(char *)vp2);

}

int Cmp_stu_sco(void*vp1,void*vp2)

return ((Student*)vp1)->score - *(int *)vp2;

}

int main()

int arr[8] = {1,2,3,5,0,9,8,7};

 int nkey = 50; 

int i1 = Search(arr,&nkey,sizeof(int),8,Cmp_int);

 printf("%d\n",i1);

  double brr[4] = {1.23,2.45,3.45,5.89}; 

double dkey = 3.455;

 int i2 = Search(brr,&dkey,sizeof(double),4,Cmp_double); 

printf("%d\n",i2); 

 char *crr[10] = {"China","Japan","America",                    "Korea","England","Germany",     "France","Russia","Singapore",     "Malaysia"}; 

//char *ckey = "America";

 char ckey[] = "America";

 int i3 = Search(crr,ckey,sizeof(char *),10,Cmp_str);

// printf("%d\n",i3);

 Student drr[3] = {"liubei",40,"caocao",80,"sunquan",100}; 

//char *name = "liubei";

 //int i4 = Search(drr,name,sizeof(Student),3,Cmp_stu_name); 

int ikey = 80;

 int i4 = Search(drr,&ikey,sizeof(Student),3,Cmp_stu_sco); 

//Student skey = {"caocao",90}; 

//int i4 = Search(drr,&skey,sizeof(Student),3); 

printf("%d\n",i4);  

return 0;

}

回调函数本质:

“我调用了你,但你又调用了我”