C语言使用函数指针数组

使用函数指针数组是C语言中一种非常灵活的编程技巧,可以在代码中实现更加复杂的逻辑,提高代码的可读性和可维护性。本文将详细讲解如何使用函数指针数组,包含以下几个方面的内容:

  1. 函数指针数组的定义和初始化
  2. 函数指针数组的使用方法
  3. 示例演示

函数指针数组的定义和初始化

函数指针数组是由多个函数指针组成的数组,其定义形式为:

returnType (*arrayName[ArraySize])(parameterList);

例如,定义一个包含3个函数指针的函数指针数组,每个函数指针指向的函数原型如下:

int func1(int a, int b);
float func2(float x, float y, float z);
double func3(double m, double n);

则可以定义如下的函数指针数组:

int (*funcArray[3])(int, int) = {func1, func1, func1};
float (*funcArray2[3])(float, float, float) = {func2, func2, func2};
double (*funcArray3[3])(double, double) = {func3, func3, func3};

这里的(*funcArray)表示函数指针数组的名称,[3]表示数组的大小,(int, int)表示函数的参数类型,{func1, func1, func1}表示函数指针数组的初始化值,这里分别使用func1初始化了数组的所有元素,也可以使用不同的函数指针进行初始化。

函数指针数组的使用方法

定义好函数指针数组后,可以通过函数指针数组访问和调用数组中的函数。

访问函数指针数组中的元素,可以使用下标运算符([]),例如:

int result = (*funcArray[0])(1, 2);

这里的funcArray[0]表示函数指针数组的第一个元素,由于是函数指针,所以需要使用(*funcArray[0])进行间接访问其指向的函数。接着,传递参数1, 2,调用了func1函数并返回其返回值。

调用函数指针数组中的函数,可以直接使用函数名进行调用,例如:

int result = funcArray[0](1, 2);

这里的funcArray[0]表示函数指针数组的第一个元素,直接使用其函数名funcArray[0]进行调用,并传递参数1, 2,调用了func1函数并返回其返回值。

示例演示

下面通过两个示例演示函数指针数组的使用。

示例1:最大值函数

定义一个函数指针数组,其中包含3个指向函数的指针,每个函数的功能是求两个数中的最大值。

#include <stdio.h>

int max(int a, int b) {
    return a > b ? a : b;
}

float max2(float x, float y, float z) {
    float temp = x > y ? x : y;
    return temp > z ? temp : z;
}

double max3(double m, double n) {
    return m > n ? m : n;
}

int main() {
    int (*maxFunc[3])(int, int) = {max, max, max};
    float (*maxFunc2[3])(float, float, float) = {max2, max2, max2};
    double (*maxFunc3[3])(double, double) = {max3, max3, max3};

    int a = 5, b = 6;
    float x = 3.14, y = 2.314, z = 4.523;
    double m = 4.534, n = 6.443;

    int result = (*maxFunc[0])(a, b);
    printf("result=%d\n", result);

    float result2 = maxFunc2[0](x, y, z);
    printf("result2=%f\n", result2);

    double result3 = (*maxFunc3[0])(m, n);
    printf("result3=%lf\n", result3);

    return 0;
}

输出结果为:

result=6
result2=4.523000
result3=6.443000

示例2:数组排序函数

定义一个函数指针数组,其中包含两个指向函数的指针,用于对整数数组进行排序,一个函数使用冒泡排序,一个函数使用快速排序。

#include <stdio.h>

void bubbleSort(int arr[], int n) {
    int i, j;
    for (i = 0; i < n - 1; i++) {
        for (j = 0; j < n - i - 1; j++) {
            if (arr[j] > arr[j + 1]) {
                int temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
    }
}

void quickSort(int arr[], int left, int right) {
    if (left >= right) {
        return;
    }

    int i = left;
    int j = right;
    int pivot = arr[(left + right) / 2];

    while (i <= j) {
        while (arr[i] < pivot) {
            i++;
        }

        while (arr[j] > pivot) {
            j--;
        }

        if (i <= j) {
            int temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
            i++;
            j--;
        }
    }

    quickSort(arr, left, j);
    quickSort(arr, i, right);
}

void sortArray(int arr[], int n, void (*sortFunc[2])(int[], int)) {
    (*sortFunc[0])(arr, n);
    // (*sortFunc[1])(arr, 0, n - 1);
}

int main() {
    void (*sortFunc[2])(int[], int) = {bubbleSort, quickSort};

    int arr[] = {23, 45, 12, 34, 56, 8, 88, 11, 90, 41};
    int n = sizeof(arr) / sizeof(arr[0]);
    sortArray(arr, n, sortFunc);

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

    return 0;
}

输出结果为:

8 11 12 23 34 41 45 56 88 90

上述两个示例展示了在不同场景下如何使用函数指针数组,可见,使用函数指针数组可以大大提升代码的灵活性和复用性,代码也更加简洁易读。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言使用函数指针数组 - Python技术站

(0)
上一篇 2023年5月9日
下一篇 2023年5月9日

相关文章

  • C语言实现进程5状态模型的状态机

    关于“C语言实现进程5状态模型的状态机”的攻略,下面是我整理的一些内容。 状态机介绍 状态机(State Machine)可以将一个系统或者一个对象的现实行为转化为状态表或者状态图的形式,从而利用一定的算法去操作或者分析这个系统/对象。在计算机领域中,状态机通常被用于解决诸如网络协议、编译器、游戏AI等的逻辑控制问题。 在操作系统中,进程的状态机通常被分为5…

    C 2023年5月23日
    00
  • Spring Cloud Gateway全局通用异常处理的实现

    下面我会提供详细的攻略来讲解 “Spring Cloud Gateway全局通用异常处理的实现”。 前置知识要求 在学习 Spring Cloud Gateway 全局通用异常处理之前,需要先熟悉以下知识: Spring Boot Spring Cloud Gateway 如果搞定了前置知识的要求,那么我们现在来讲解具体的实现。 Spring Cloud G…

    C 2023年5月22日
    00
  • C++实例代码详解友元函数

    C++实例代码详解友元函数 友元函数概念 友元函数是指可以访问一个类的私有成员和保护成员的非成员函数。友元函数不是类的成员函数,但是它可以访问类中的非公有成员。需要注意的是,友元函数不会被继承。 友元函数的语法格式如下: friend return_type function_name( parameter_list ); 其中,关键字 friend 声明了…

    C 2023年5月24日
    00
  • IIS解析json的配置方法汇总

    当使用IIS托管网站时,如果需要让网站支持解析输入的json数据,需要对IIS进行相应的配置。以下是配置IIS解析json数据的具体步骤: 步骤一:安装ASP.NET Core Module 在配置IIS支持json数据解析之前,我们需要确保系统中已安装了ASP.NET Core Module。可以通过以下步骤进行安装: 打开服务器管理器,在左侧导航栏选择“…

    C 2023年5月23日
    00
  • C语言switch语句详解

    C语言switch语句详解 简介 在C语言中,switch语句是一种多分支的选择结构,可以用来比对多个值,根据不同的值来执行对应的代码块。 语法 switch语句的基本语法如下: switch(expression){ case constant-expression1: statement(s); break; case constant-expressi…

    C 2023年5月24日
    00
  • c++ 内联函数和普通函数的区别

    C++中内联函数和普通函数都是函数的两种实现方式。内联函数是C++特有的一种函数实现方式,主要把函数的内容直接嵌入到调用语句中,而不是像普通函数那样调用函数。 内联函数和普通函数的区别 内联函数的调用时间和执行时间比普通函数更快。这是因为内联函数会把函数的内容嵌入到调用语句中,避免了函数调用的开销。而普通函数调用则需要跳转到函数执行的地址去执行。这样一来,在…

    C 2023年5月22日
    00
  • C语言应用领域分析

    C语言应用领域分析攻略 1. 概述 C语言是一门功能强大的编程语言,被广泛应用于各个领域。在进行C语言应用领域分析之前,我们需要了解一下C语言的特点和优势。 C语言是一门高效的编程语言,能够快速地处理大量数据。 C语言的兼容性非常好,可以运行在各种平台上,包括Windows、Mac OS、Linux等。 C语言具有强大的功能库,涵盖了计算机科学中的各种领域,…

    C 2023年5月23日
    00
  • 如何寻找数组中的第二大数

    如何寻找数组中的第二大数是一个比较常见的问题。下面我将为大家详细讲解如何寻找数组中的第二大数的完整攻略。 1. 题目理解 首先需要明确题目的意思。题目所说的数组是一个由整数组成的序列。其次,题目要求找到数组中第二大的数,也就是说要找到所有元素中第二大的数。 2. 方法总结 如何在一个数组中找到第二大的数呢?下面是一些比较常见的方法: 方法一:排序 排序是一种…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部