函数指针做函数参数(回调函数)的例子
提供一个函数可以输出任意类型的数据。
实例一:
void my_printf(void * data,void(*mp)(void *)){
// 利用传入的数据作为参数去调用第二个参数对应的方法
mp(data);
}
// 打印整形数据方法
void print_int(void * data){
int * value = data;
printf("%d\n",*value);
}
// 打印浮点型形数据方法
void print_double(void * data){
double * value = data;
printf("%f\n",*value);
}
struct person{
char name[64];
int age;
};
// 打印结构体数据方法
void print_person(void * data){
struct person * value = data;
printf("姓名:%s 年龄:%d\n",value->name,value->age);
}
int main(void){
int a = 10;
my_printf(&a,print_int);
double b = 3.1415926;
my_printf(&b,print_double);
struct person p = {"lisi",23};
my_printf(&p,print_person);
return 0;
}
实例二:
// 打印不同数组的方法
// 参数一:传入数组首地址 参数二:数组中每个元素占用内存空间 参数三:数组长度
void print_all_arr(void * arr,int eleSize,int len,void(*mp)(void *)){
char * p = arr; // 利用p指针接受数组首地址
for(int i=0;i<len;i++){
// 获取每个元素的地址
char * pAddr = p + eleSize * i;
// 输出打印的方法
mp(pAddr);
}
}
// 打印整形数据方法
void print_int(void * data){
int * value = data;
printf("%d\n",*value);
}
struct person{
char name[64];
int age;
};
// 打印结构体数据方法
void print_person(void * data){
struct person * value = data;
printf("姓名:%s 年龄:%d\n",value->name,value->age);
}
int main(void){
int arr[] = {10,20,30,40,50};
int len1 = sizeof(arr)/sizeof(int);
print_all_arr(arr,sizeof(int),len1,print_int);
struct person pArray[] = {
{"lisi",23},{"wangwu",20},{"zhangsan",21}};
int len2 = sizeof(pArray)/sizeof(struct person);
print_all_arr(pArray,sizeof(struct person),len2,print_person);
return 0;
}
还没有评论,来说两句吧...