函数指针数组

函数指针数组

前言

今天参加了一笔试,笔试完事以后,一道函数指针数组如何定义的题目一直缠绕在我心头。回到宿舍,我请教了学习委员,他很耐心的解答了我的疑问,并且循循善诱,帮助我梳理了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

原文地址:https://www.cnblogs.com/studentWangqy/p/15400307.html