函数指针数组:定义、用法和优点

一、函数指针数组定义

函数指针数组其实就是一个数组,里面的每一个元素都是一个指针,而这个指针指向的是一个函数的地址。


int (* func_ptr_arr[])(int, int);

上面的代码定义了一个函数指针数组,数组的每一个元素都是一个指向两个int参数的函数指针。

二、函数指针数组怎么定义

函数指针数组的定义格式如下:


返回值类型 (* 数组名[数组长度])(参数列表);

其中,返回值类型是函数的返回值类型,数组名是你自己定义的数组名称,在 [] 中指定数组长度,参数列表是函数的参数类型列表。

三、函数指针数组用法

函数指针数组最主要的用途在于可以使用函数指针数组来调用不同的函数。


#include <stdio.h>

int add(int a, int b){ return a + b; }
int sub(int a, int b){ return a - b; }
int mul(int a, int b){ return a * b; }

int main(){
    int (* func_ptr_arr[])(int, int) = {add, sub, mul};
    int a = 10, b = 5;

    int result = func_ptr_arr[0](a, b);
    printf("add: %d\n", result);
    result = func_ptr_arr[1](a, b);
    printf("sub: %d\n", result);
    result = func_ptr_arr[2](a, b);
    printf("mul: %d\n", result);

    return 0;
}

上面的代码演示了如何定义一个函数指针数组,然后使用这个数组来调用三个不同的函数,并输出结果。在这个例子中,函数指针数组可以很方便地切换函数的调用。

四、函数指针数组实例

函数指针数组可以应用于很多不同的场景,比如在数据结构中,可以使用函数指针数组来实现多态。


#include <stdio.h>

typedef struct{
    void (* show)(void *);
    void (* update)(void *, int);
    void * data;
}Shape;

void show_shape(Shape * sp){
    sp->show(sp->data);
}

void update_shape(Shape * sp, int val){
    sp->update(sp->data, val);
}

typedef struct{
    int width;
    int height;
}Rect;

void show_rect(void * ptr){
    Rect * rp = (Rect *)ptr;
    printf("Rect: %d, %d\n", rp->width, rp->height);
}

void update_rect(void * ptr, int val){
    Rect * rp = (Rect *)ptr;
    rp->width += val;
    rp->height += val;
}

typedef struct{
    int radius;
}Circle;

void show_circle(void * ptr){
    Circle * cp = (Circle *)ptr;
    printf("Circle: %d\n", cp->radius);
}

void update_circle(void * ptr, int val){
    Circle * cp = (Circle *)ptr;
    cp->radius += val;
}

int main(){
    Rect rect = {10, 20};
    Circle circle = {5};
    
    Shape shapes[] = {
        {show_rect, update_rect, &rect},
        {show_circle, update_circle, &circle}
    };
    
    for(int i=0; i<2; i++){
        show_shape(&shapes[i]);
        update_shape(&shapes[i], 5);
        show_shape(&shapes[i]);
    }
    
    return 0;
}

上面的代码演示了如何使用函数指针数组来定义Shape这个数据结构,并在其中存储Rect和Circle两种图形类型。通过定义不同的函数指针来实现show和update的多态效果。

五、函数指针数组问题

虽然函数指针数组有很多优点,但是也存在一些问题。最常见的问题就是函数指针数组容易出现数组溢出、空指针等问题,需要特别注意指针的判断。

六、函数指针参数

函数指针也可以作为函数参数进行传递。


#include <stdio.h>

void print_numbers(int * arr, int len){
    for(int i=0; i<len; i++){
        printf("%d ", arr[i]);
    }
    printf("\n");
}

void process_numbers(int * arr, int len, int (* process)(int)){
    for(int i=0; i<len; i++){
        arr[i] = process(arr[i]);
    }
}

int add_five(int num){ return num + 5; }
int subtract_one(int num){ return num - 1; }

int main(){
    int arr[] = {1, 2, 3, 4, 5};
    int len = sizeof(arr) / sizeof(arr[0]);

    print_numbers(arr, len);
    process_numbers(arr, len, add_five);
    print_numbers(arr, len);
    process_numbers(arr, len, subtract_one);
    print_numbers(arr, len);

    return 0;
}

上面的代码演示了如何定义process_numbers函数,并在其中传入一个函数指针作为处理函数进行数值处理。

七、函数指针数组的优点

函数指针数组的最大优点在于可以实现函数的动态调用。

比如,在开发一个多线程网络程序时,可能需要在不同的线程中使用不同的函数进行处理,这个时候就可以使用函数指针数组来实现程序的灵活处理。

此外,使用函数指针数组还可以减少程序中的重复代码,使程序更加简洁和易读。

八、函数指针数组性能和速度

函数指针数组的性能和速度与普通函数调用相比稍微慢一些,但是这种差距很小,在实际使用中影响不大。

九、函数指针数组如何使用

要使用函数指针数组,首先需要明确要调用的函数类型和参数类型,然后定义一个指针数组,将函数指针存储在其中,通过数组下标来实现函数调用。

需要注意内存分配和指针判断等问题,避免出现数组溢出等风险。

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/301910.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-12-30 16:10
下一篇 2024-12-30 16:10

相关推荐

  • Python中引入上一级目录中函数

    Python中经常需要调用其他文件夹中的模块或函数,其中一个常见的操作是引入上一级目录中的函数。在此,我们将从多个角度详细解释如何在Python中引入上一级目录的函数。 一、加入环…

    编程 2025-04-29
  • Python中capitalize函数的使用

    在Python的字符串操作中,capitalize函数常常被用到,这个函数可以使字符串中的第一个单词首字母大写,其余字母小写。在本文中,我们将从以下几个方面对capitalize函…

    编程 2025-04-29
  • Python导入数组

    本文将为您详细阐述Python导入数组的方法、优势、适用场景等方面,并附上代码示例。 一、numpy库的使用 numpy是Python中一个强大的数学库,其中提供了非常丰富的数学函…

    编程 2025-04-29
  • Python中set函数的作用

    Python中set函数是一个有用的数据类型,可以被用于许多编程场景中。在这篇文章中,我们将学习Python中set函数的多个方面,从而深入了解这个函数在Python中的用途。 一…

    编程 2025-04-29
  • 三角函数用英语怎么说

    三角函数,即三角比函数,是指在一个锐角三角形中某一角的对边、邻边之比。在数学中,三角函数包括正弦、余弦、正切等,它们在数学、物理、工程和计算机等领域都得到了广泛的应用。 一、正弦函…

    编程 2025-04-29
  • 单片机打印函数

    单片机打印是指通过串口或并口将一些数据打印到终端设备上。在单片机应用中,打印非常重要。正确的打印数据可以让我们知道单片机运行的状态,方便我们进行调试;错误的打印数据可以帮助我们快速…

    编程 2025-04-29
  • Python3定义函数参数类型

    Python是一门动态类型语言,不需要在定义变量时显示的指定变量类型,但是Python3中提供了函数参数类型的声明功能,在函数定义时明确定义参数类型。在函数的形参后面加上冒号(:)…

    编程 2025-04-29
  • Python返回数组:一次性搞定多种数据类型

    Python是一种多用途的高级编程语言,具有高效性和易读性的特点,因此被广泛应用于数据科学、机器学习、Web开发、游戏开发等各个领域。其中,Python返回数组也是一项非常强大的功…

    编程 2025-04-29
  • Python定义函数判断奇偶数

    本文将从多个方面详细阐述Python定义函数判断奇偶数的方法,并提供完整的代码示例。 一、初步了解Python函数 在介绍Python如何定义函数判断奇偶数之前,我们先来了解一下P…

    编程 2025-04-29
  • Python实现计算阶乘的函数

    本文将介绍如何使用Python定义函数fact(n),计算n的阶乘。 一、什么是阶乘 阶乘指从1乘到指定数之间所有整数的乘积。如:5! = 5 * 4 * 3 * 2 * 1 = …

    编程 2025-04-29

发表回复

登录后才能评论