为了账号安全,请及时绑定邮箱和手机立即绑定
首页 手记 【九月打卡】第17天【养成记】嵌入式挑战第17天,指针...

【九月打卡】第17天【养成记】嵌入式挑战第17天,指针函数、函数指针、回调函数

2022.09.22 23:37 33浏览

课程章节:

课程名称:物联网/嵌入式工程师
章节名称:第4周之第四讲 1-14 至 1-17 C语言中的函数:指针函数、函数指针、回调函数
讲师姓名:大白老师

课程内容:

C语言中的函数:指针函数

指针函数

本质:是一个函数,只不过返回值是一个地址。
思考:如何定义一个指针函数?
返回值类型 * 函数名称 (类型1 参数1,类型2 参数2 ,…);

例如:
int * fun (int a, int b);
(也就是说,指针函数其实和普通的函数一样的,只不过返回值是一个指针类型。并且它必须用同类型的指针变量来接受)

代码示例

#include <stdio.h>

// int *plen = &num;
// *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;
}

课程评价:

通过指针函数、函数指针、回调函数的学习,对函数编写有了熟练的掌握,不过课后练习是越来越难了,自己还需要多多练习。

图片描述

点击查看更多内容
0人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
全栈工程师
手记
粉丝
11
获赞与收藏
0

关注TA,一起探索更多经验知识

同主题相似文章浏览排行榜

风间影月说签约讲师

50篇手记,涉及Java、MySQL、Redis、Spring等方向

进入讨论

Tony Bai 说签约讲师

146篇手记,涉及Go、C、Java、Python等方向

进入讨论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消