【九月打卡】第17天【养成记】嵌入式挑战第17天,指针函数、函数指针、回调函数
2022/9/24 3:17:04
本文主要是介绍【九月打卡】第17天【养成记】嵌入式挑战第17天,指针函数、函数指针、回调函数,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
课程章节:
课程名称:物联网/嵌入式工程师
章节名称:第4周之第四讲 1-14 至 1-17 C语言中的函数:指针函数、函数指针、回调函数
讲师姓名:大白老师
课程内容:
C语言中的函数:指针函数
指针函数
本质:是一个函数,只不过返回值是一个地址。
思考:如何定义一个指针函数?
返回值类型 * 函数名称 (类型1 参数1,类型2 参数2 ,…);
例如: int * fun (int a, int b); (也就是说,指针函数其实和普通的函数一样的,只不过返回值是一个指针类型。并且它必须用同类型的指针变量来接受)
代码示例
#include <stdio.h> // int *plen = # // *plen <===> num int * design_array(int *plen) { static int a[] = {100,200,300,400,500}; int i = 0; int len = sizeof(a)/sizeof(a[0]); *plen = len; // 什么时候传地址?什么时候传递变量? return a; } // 获得数组的首地址和长度 void output(int *p,int plen) { int i = 0; for(i = 0;i < plen;i++) { printf("%d ",p[i]); } putchar('\n'); return ; } int main(int argc, const char *argv[]) { int *p = NULL; int num = 0; // num = len; p = design_array(&num); output(p,num); return 0; }
课后练习
(1)要求大家是设计一个design_arary()函数,自己定义返回值和参数。 要求design_array()函数中定义一个,static char a[100] = {0};,然后把数组首地址和长度返回。 (2)设计一个input_array()函数,自定义返回和参数,要求用户从键盘输入任意的字符串,存放到a数组中 (3)设计一个output_array()函数,要求输出a数组中的每个一字符,以空格作为区分。 w u h a n s h a n g h a i (4)设计一个cout_space()函数,自定义返回和参数,要求用户统计数组a中用户输入的空格个数,并返回值给main函数。 (5)main()函数调用以上函数,并输出空格个数。
函数指针
概述
函数指针:本质是一个指针
,只不过使用来函数的地址的。 通过函数指针来调用,我们需要的函数
。
定义方法
数据类型 (*指针变量名)(类型1 参数1,类型2 参数2...); 注: (1)函数名代表函数的首地址 (2)上述中的参数1,参数2.。。等可省略
示例
例如: int a; //int short b; //short int c[5]; //int [5] &c <===> int (*p) [5] int add(int a,int b) //add <===> int (int a,int b) { return a + b; } //int (*funp)(int a,int b) 判断变量类型的方法:把变量名去掉,剩下的就是类型。 例如: int (*funp)(int ,int) = add; //funp = add add(10,20); //add <===> 0xdfff999 <===> funp funp(10,20); //0xdfff999(10,20)
代码示例
#include <stdio.h> int add(int a,int b) //===> int (int a,int b) { return a + b; } int sub(int a,int b) //===> int (int a,int b) { return a - b; } int main(int argc, const char *argv[]) { int ret = 0; ret = add(10,20); //ret = 0x8048414(10,20) printf("a + b = %d\n",ret); printf("add = %p\n",add); printf("============================\n"); int (*funp)(int ,int ) = add; printf("funp = %p\n",funp); ret = funp(10,20); //ret = 0x8048414(10,20) printf("a + b = %d\n",ret); funp = sub; ret = funp(10,20); printf("a - b = %d\n",ret); return 0; }
回调函数
概念
回调函数就是一个通过函数指针调用的函数。 如果你把函数的地址作为参数传递给另一个函数,在另一个函数中通过指针来接收, 通过指针来调用其函数,我们就说这是回调函数。
示例代码
#include <stdio.h> int add(int a,int b) { return a + b; } int sub(int a,int b) { return a - b; } int calc(int a,int b,int (*pfun)(int,int)) { int result; result = pfun(a,b); return result; } int main() { int result = 0; result = calc(20,10,add) printf("a + b = %d\n",result); result = calc(20,10,sub) printf("a - b = %d\n",result); return 0; }
课后任务
练习
1. 设计一个int find_max(int x,int y)函数,要求返回两个数中较大的值 2. 设计一个int find_min(int x,int y)函数,要求返回两个数中较小的值 3. 设计一个int get_result(int x,int y,int (*pfun)(int ,int))函数,内部调用pfun函数,x,y当作pfun的参数,返回对应的结果。 4. main函数调用上述函数,输出结果
学习笔记:
练习
char buf[] = "I Love China"; (1)设计一个count_uppercase_character()函数,自己定义参数和返回值,要求 统计上述数组中大写字符的个数。 (2)调用自己设计的函数,并输出。
代码
#include <stdio.h> #include <string.h> int count_uppercase_character(const char *p) { int count = 0; for (int i = 0; i < strlen(p); ++i) { if (p[i] >= 'A' && p[i] <= 'Z') { count++; } } return count; } int main() { int ret = 0, length = 0; char buf[] = "I Love China"; ret = count_uppercase_character(buf); printf("ret = %d\n", ret); return 0; }
课程评价:
通过指针函数、函数指针、回调函数的学习,对函数编写有了熟练的掌握,不过课后练习是越来越难了,自己还需要多多练习。
这篇关于【九月打卡】第17天【养成记】嵌入式挑战第17天,指针函数、函数指针、回调函数的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-05-19永别了,微服务架构!
- 2024-05-15鸿蒙生态设备数量超8亿台
- 2024-05-13TiDB + ES:转转业财系统亿级数据存储优化实践
- 2024-05-09“2024鸿蒙零基础快速实战-仿抖音App开发(ArkTS版)”实战课程已上线
- 2024-05-09聊聊如何通过arthas-tunnel-server来远程管理所有需要arthas监控的应用
- 2024-05-09log4j2这么配就对了
- 2024-05-09nginx修改Content-Type
- 2024-05-09Redis多数据源,看这篇就够了
- 2024-05-09Google Chrome驱动程序 124.0.6367.62(正式版本)去哪下载?
- 2024-05-09有没有大佬知道这种数据应该怎么抓取呀?