课程名称:物联网/嵌入式工程师
章节名称:第4周之第四讲 1-14 至 1-17 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; }
通过指针函数、函数指针、回调函数的学习,对函数编写有了熟练的掌握,不过课后练习是越来越难了,自己还需要多多练习。