函数指针
来源:互联网 发布: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;
}
回调函数本质:
“我调用了你,但你又调用了我”
- 指针函数 函数指针
- 函数指针/指针函数
- 指针函数&函数指针
- 函数指针 指针函数
- 函数指针 指针函数
- 指针函数,函数指针
- 函数指针,指针函数,
- 指针函数,函数指针
- 函数指针 指针函数
- 函数指针、指针函数
- 指针函数&函数指针
- 函数指针 指针函数
- 函数指针 指针函数
- 函数指针&指针函数
- 指针函数 函数指针
- 指针函数 &函数指针
- 函数指针&指针函数
- void指针 函数指针
- 1800万知乎用户的爬取
- 可变参数列表,stdarg
- dbcp连接池简单封装
- golang设计模式(5)原型模式
- HTTP协议介绍(分析tinyhttpd【上】)
- 函数指针
- 判断回文问题
- jdbc:mysql连接字符串
- Ansible部署TiDB集群
- html 布局方式
- 认识Linux和安装 centos7
- [CF]_[心得]_[870B]
- 判断等式进制问题
- PHP--环境搭建