【九月打卡】第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 = &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;
}

课程评价:

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

图片描述



这篇关于【九月打卡】第17天【养成记】嵌入式挑战第17天,指针函数、函数指针、回调函数的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程