• 函数指针数组


    函数指针数组

    前言

    今天参加了一笔试,笔试完事以后,一道函数指针数组如何定义的题目一直缠绕在我心头。回到宿舍,我请教了学习委员,他很耐心的解答了我的疑问,并且循循善诱,帮助我梳理了C语言当中数组指针指针数组等几个容易混淆的概念。
    在他的帮助下,我学习了很多,也把这些学习经验分享出来,供大家参考。

    问题引入

    请定义一个大小为10的数组a,其元素都是函数指针,函数类型为int func(int)

    问题解答

    QQ图片20211013002635
    第一个int是返回值,第二个(int)是参数

    中间的 (*a [2]) 就代表 a 是存放 2个指针变量的数组

    指针数组和数组指针

    C语言指针数组和数组指针_C语言中文网 (biancheng.net)

    img

    函数指针

    函数指针及其定义和用法,C语言函数指针详解 (biancheng.net)

    推广

    int * p[10]

    因为[]的优先级要比*的高

    所以先确定 p 是数组,然后确定数组元素是指针

    如果是 int (*p) [10]

    因为括号提高了优先级,所以 * 先和 p 绑定

    确定了 p 是指针,然后根据 int [10] 确定 p 指向的内容是存储了 10个int 型变量的数组

    就看谁先跟这个 变量的名字 p 绑定上
    先绑定上 p 就能决定 p 是什么个类型的变量
    然后再根据其他修饰,来确定变量 p 存放的内容

    综合应用

    #include <stdio.h>
    #include <malloc.h>
    
    int func1(int a)
    {
        puts("a");
    }
    
    int func2(int a)
    {
        puts("b");
    }
    main()
    {
        int b[10];              // 普通int数组 
        int *p[10];             // 指针数组
        int (*p1) [10];         // 数组指针
        int (*a [2]) (int);     // 函数指针数组
        int i = 0;
    
        p1 = malloc(sizeof(int)*10);    // 初始化数组指针
        a[0] = func1;                   // 为函数指针数组的每个元素赋值
        a[1] = func2;
        a[0](1);
        a[1](2);
        
        for (i = 0; i < 10; ++i)        // 为普通int函数的每个元素赋值
            b[i] = i;
        
        for (i = 0; i < 10; ++i)        // 为指针数组的每个元素赋值
            p[i] = &b[i];
        for (i = 0; i < 10; ++i)
            printf("%d%c", *p[i],  (i == 9 ? '
    ' : ' '));
        for (i = 0; i < 10; ++i)        // 为数组指针指向的数组的每个元素赋值
            (*p1)[i] = *p[i];
        for (i = 0; i < 10; ++i)
            printf("%d%c", (*p1)[i], (i == 9 ? '
    ' : ' '));
    
        
    }
    

    运行结果

    QQ图片20211013003917

  • 相关阅读:
    时序数据库入门
    MySQL执行计划extra中的using index 和 using where using index 的区别
    ETL的详细解释定义
    六种 主流ETL 工具的比较(DataPipeline,Kettle,Talend,Informatica,Datax ,Oracle Goldengate)
    使用 IntraWeb (37)
    使用 IntraWeb (36)
    使用 IntraWeb (35)
    使用 IntraWeb (34)
    使用 IntraWeb (33)
    使用 IntraWeb (32)
  • 原文地址:https://www.cnblogs.com/studentWangqy/p/15400307.html
Copyright © 2020-2023  润新知