C高级编程 第十天(函数指针 回调函数)

2024-08-28 05:44

本文主要是介绍C高级编程 第十天(函数指针 回调函数),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

1.函数指针

①先定义函数类型,再通过类型定义函数指针变量

②先定义函数指针的类型,再通过类型定义函数指针变量

③直接定义函数指针变量(重点)

2.回调函数

案例一:打印任意类型数据

案例二:打印任意类型数组

案例三:查找数组中的元素


1.函数指针

void func(int a, char b)
{printf("hello world");
}

①先定义函数类型,再通过类型定义函数指针变量

void test1()
{typedef void(FUNC_TYPE)(int, char);FUNC_TYPE* pFunc = func;pFunc(10, 'a');
}

②先定义函数指针的类型,再通过类型定义函数指针变量

void test2()
{typedef void(*FUNC_TYPE)(int, char);FUNC_TYPE pFunc = func;pFunc(20, 'b');
}

③直接定义函数指针变量(重点)

void test3()
{void(*p)(int, char) = func;p(30, 'c');
}

2.回调函数

案例一:打印任意类型数据

void myPrint(void* data,void(*mp)(void*))
{mp(data);
}struct Person
{int age;char name[64];
};void printInt(void* data)
{int* number = (int*)data;printf("%d\n", *number);
}void printDouble(void* data)
{double* number = (double*)data;printf("%f\n", *number);
}void printPerson(void* data)
{struct Person* number = (struct Person*)data;printf("姓名:%s,年龄:%d\n", number->name,number->age);
}int main()
{int a = 8;double b = 3.14;struct Person p = { 18,"ZJX"};myPrint(&a,printInt);myPrint(&b,printDouble);myPrint(&p,printPerson);return 1;
}

案例二:打印任意类型数组

void myPrint(void* data, void(*mp)(void*))
{mp(data);
}struct Person
{int age;char name[64];
};void printIntArr(void* data)
{int* number = (int*)data;for (int i = 0; i < 5; i++){printf("%d\n", number[i]);}
}void printDoubleArr(void* data)
{double* number = (double*)data;for (int i = 0; i < 5; i++){printf("%f\n", number[i]);}
}void printPersonArr(void* data)
{struct Person* number = (struct Person*)data;for (int i = 0; i < 5; i++){printf("姓名:%s,年龄:%d\n", number[i].name, number[i].age);}
}int main()
{int a[5] = {6,8,6,8,6};double b[5] = { 6.6,8.8,6.6,8.8,6.6 };struct Person p[5] ={{ 18,"ZJX" },{ 18,"ZZZ" },{ 18,"JJJ" },{ 18,"XXX" },{ 18,"XJZ" }};myPrint(&a, printIntArr);myPrint(&b, printDoubleArr);myPrint(&p, printPersonArr);return 1;
}

案例三:查找数组中的元素

int findArrayEle(void* array, int eleSize, int len, void* data,int(*compare)(void*,void*))
{char* arr = (char*)array;for (int i = 0; i < len; i++){char* arr1 = arr + eleSize * i;//数组中每个元素的首地址if (1 == compare(arr1, data)){return 1;}}return 0;
}struct Person
{int age;char name[64];
};int compare(void* a, void* b)
{struct Person* a1 = (struct Person*)a;struct Person* b1 = (struct Person*)b;if (strcmp(a1->age, b1->age) == 0 && strcmp(a1->name , b1->name)==0){return 1;}return 0;
}int main()
{struct Person p[5] ={{ 18,"ZJX" },{ 18,"ZZZ" },{ 18,"JJJ" },{ 18,"XXX" },{ 18,"XJZ" }};struct Person pFind = { 18,"XJZ" };int result=findArrayEle(p, sizeof(struct Person), sizeof(p) / sizeof(struct Person), &pFind,compare);
}

这篇关于C高级编程 第十天(函数指针 回调函数)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1113892

相关文章

Python itertools中accumulate函数用法及使用运用详细讲解

《Pythonitertools中accumulate函数用法及使用运用详细讲解》:本文主要介绍Python的itertools库中的accumulate函数,该函数可以计算累积和或通过指定函数... 目录1.1前言:1.2定义:1.3衍生用法:1.3Leetcode的实际运用:总结 1.1前言:本文将详

轻松上手MYSQL之JSON函数实现高效数据查询与操作

《轻松上手MYSQL之JSON函数实现高效数据查询与操作》:本文主要介绍轻松上手MYSQL之JSON函数实现高效数据查询与操作的相关资料,MySQL提供了多个JSON函数,用于处理和查询JSON数... 目录一、jsON_EXTRACT 提取指定数据二、JSON_UNQUOTE 取消双引号三、JSON_KE

MySQL数据库函数之JSON_EXTRACT示例代码

《MySQL数据库函数之JSON_EXTRACT示例代码》:本文主要介绍MySQL数据库函数之JSON_EXTRACT的相关资料,JSON_EXTRACT()函数用于从JSON文档中提取值,支持对... 目录前言基本语法路径表达式示例示例 1: 提取简单值示例 2: 提取嵌套值示例 3: 提取数组中的值注意

C#多线程编程中导致死锁的常见陷阱和避免方法

《C#多线程编程中导致死锁的常见陷阱和避免方法》在C#多线程编程中,死锁(Deadlock)是一种常见的、令人头疼的错误,死锁通常发生在多个线程试图获取多个资源的锁时,导致相互等待对方释放资源,最终形... 目录引言1. 什么是死锁?死锁的典型条件:2. 导致死锁的常见原因2.1 锁的顺序问题错误示例:不同

深入解析Spring TransactionTemplate 高级用法(示例代码)

《深入解析SpringTransactionTemplate高级用法(示例代码)》TransactionTemplate是Spring框架中一个强大的工具,它允许开发者以编程方式控制事务,通过... 目录1. TransactionTemplate 的核心概念2. 核心接口和类3. TransactionT

Java function函数式接口的使用方法与实例

《Javafunction函数式接口的使用方法与实例》:本文主要介绍Javafunction函数式接口的使用方法与实例,函数式接口如一支未完成的诗篇,用Lambda表达式作韵脚,将代码的机械美感... 目录引言-当代码遇见诗性一、函数式接口的生物学解构1.1 函数式接口的基因密码1.2 六大核心接口的形态学

PyCharm接入DeepSeek实现AI编程的操作流程

《PyCharm接入DeepSeek实现AI编程的操作流程》DeepSeek是一家专注于人工智能技术研发的公司,致力于开发高性能、低成本的AI模型,接下来,我们把DeepSeek接入到PyCharm中... 目录引言效果演示创建API key在PyCharm中下载Continue插件配置Continue引言

Oracle的to_date()函数详解

《Oracle的to_date()函数详解》Oracle的to_date()函数用于日期格式转换,需要注意Oracle中不区分大小写的MM和mm格式代码,应使用mi代替分钟,此外,Oracle还支持毫... 目录oracle的to_date()函数一.在使用Oracle的to_date函数来做日期转换二.日

Python中列表的高级索引技巧分享

《Python中列表的高级索引技巧分享》列表是Python中最常用的数据结构之一,它允许你存储多个元素,并且可以通过索引来访问这些元素,本文将带你深入了解Python列表的高级索引技巧,希望对... 目录1.基本索引2.切片3.负数索引切片4.步长5.多维列表6.列表解析7.切片赋值8.删除元素9.反转列表

正则表达式高级应用与性能优化记录

《正则表达式高级应用与性能优化记录》本文介绍了正则表达式的高级应用和性能优化技巧,包括文本拆分、合并、XML/HTML解析、数据分析、以及性能优化方法,通过这些技巧,可以更高效地利用正则表达式进行复杂... 目录第6章:正则表达式的高级应用6.1 模式匹配与文本处理6.1.1 文本拆分6.1.2 文本合并6