C语言使用函数指针

C语言中,函数指针是指向函数的指针变量。使用函数指针可以让程序具有更高的灵活性和可扩展性,能够更好地适应不同的需求。

1. 声明函数指针

声明函数指针的语法如下:

返回类型 (*指针变量名)(参数列表);

例如:

int (*myFunc)(int a, int b);

上述代码中,声明了一个名为 myFunc 的指向返回类型为 int,参数列表为 (int, int) 的函数指针变量。

2. 定义函数指针

定义函数指针就是将指针变量指向特定的函数。例如:

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

int (*myFunc)(int a, int b) = max;

上述代码中,将 myFunc 指向了 max 函数。这样,可以通过 myFunc 调用 max 函数。

3. 函数指针作为函数参数

函数指针作为函数参数可以用于回调函数、函数指针数组等场合。例如:

int calculate(int a, int b, int (*func)(int, int)) {
    return func(a, b);
}

int add(int a, int b) {
    return a + b;
}

int substract(int a, int b) {
    return a - b;
}

int main() {
    int a = 10, b = 5;
    int result1 = calculate(a, b, add);
    int result2 = calculate(a, b, substract);
    printf("%d %d", result1, result2);
    return 0;
}

上述代码中,calculate 函数接收三个参数,前两个参数是要进行计算的两个数,第三个参数是函数指针,用于指定要进行的计算方式。在 main 函数中,先定义了 add 和 substract 两个函数,然后通过 calculate 函数分别调用了这两个函数。

4. 函数指针数组

函数指针数组是一种数组类型,每个数组元素都是一个指向函数的指针变量。当需要按照一定的规则调用不同的函数时,可以使用函数指针数组。例如:

int add(int a, int b) {
    return a + b;
}

int substract(int a, int b) {
    return a - b;
}

int multiply(int a, int b) {
    return a * b;
}

int divide(int a, int b) {
    return b == 0 ? 0 : a / b;
}

int main() {
    int a = 10, b = 5;
    int (*funcArr[4])(int, int) = {add, substract, multiply, divide};
    for (int i = 0; i < 4; i++) {
        printf("%d ", funcArr[i](a, b));
    }
    return 0;
}

上述代码中,定义了一个名为 funcArr 的函数指针数组,数组中包含 4 个元素。每个元素都是一个指向特定函数的函数指针。在 main 函数中,通过 for 循环遍历数组,依次调用了这 4 个函数,并输出结果。

5. 示例说明

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

示例1:函数指针作为回调函数

typedef void (*CallBackFunc)(int);

void print1(int n) {
    printf("print1: %d\n", n);
}

void print2(int n) {
    printf("print2: %d\n", n);
}

void loop(int count, CallBackFunc func) {
    for (int i = 1; i <= count; i++) {
        func(i);
    }
}

int main() {
    loop(3, print1);
    loop(5, print2);
    return 0;
}

上述代码中,定义了一个回调函数类型 CallBackFunc,该类型的变量可以指向一个接收 int 类型参数并返回 void 类型的函数。然后定义了两个打印函数 print1 和 print2。在 loop 函数中,循环执行 func 函数 count 次,并将变量 i 作为参数传递给 func 函数。在 main 函数中,通过调用 loop 函数,分别将 print1 和 print2 作为参数传递给 func,实现了不同的打印方式。

示例2:函数指针作为排序函数

#include <stdio.h>

int compare(int a, int b) {
    if (a > b) return 1;
    if (a < b) return -1;
    return 0;
}

void sort(int *arr, int size, int (*compareFunc)(int, int)) {
    for (int i = 0; i < size - 1; i++) {
        for (int j = 0; j < size - i - 1; j++) {
            if (compareFunc(arr[j], arr[j + 1]) > 0) {
                int temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
    }
}

int main() {
    int arr[] = {3, 7, 1, 5, 9, 2, 8, 4, 6};
    int size = sizeof(arr) / sizeof(int);
    sort(arr, size, compare);
    for (int i = 0; i < size; i++) {
        printf("%d ", arr[i]);
    }
    return 0;
}

上述代码中,首先定义了一个 compare 函数,该函数接收两个参数并返回一个 int 类型的值,用于比较这两个参数的大小。然后定义了一个 sort 函数,该函数接收一个整型数组、数组大小以及一个函数指针,用于对数组进行排序。在 sort 函数中,使用了冒泡排序的算法进行排序,并使用 compareFunc 指针指向的函数进行比较。在 main 函数中,定义了一个整型数组,并通过调用 sort 函数对该数组进行排序,在排序结果被输出后,示例结束。

综上所述,函数指针可以用于多种场合,需要根据实际情况进行选择和使用。

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

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

相关文章

  • c4droid怎么安装 c4droid安装教程及使用说明

    C4droid是什么? C4droid是一款在安卓手机上运行C/C++代码的开发环境,它拥有完整的C/C++语言库,支持多文件编程、自动补全代码、调试程序等多种功能。在安卓上安装C4droid,可以让你在手机上随时随地编写并执行C/C++程序代码。 C4droid的安装 安装C4droid需要以下几个步骤: 步骤一:下载安装C4droid 在安卓市场或者官网…

    C 2023年5月23日
    00
  • QT获取显示当前时间和日期的方法(用QTime,QDate和QDateTime)

    获取当前时间和日期是Qt中常用的操作之一,通过使用QTime、QDate和QDateTime类,可以方便地实现这个功能。下面是获取当前时间和日期的详细攻略。 使用QTime获取当前时间 要使用QTime获取当前时间,可以使用QTime::currentTime()方法获取当前系统时间的QTime对象。示例代码如下: #include <QTime&gt…

    C 2023年5月22日
    00
  • MFC程序执行过程深入剖析

    MFC程序执行过程深入剖析 前言 MFC(Microsoft Foundation Classes)是一组用于开发Windows界面应用程序的C++类库,开发人员可以使用MFC快速地开发Windows系统下的应用程序。然而,在实际开发中,掌握MFC程序的执行过程是极为重要的,本文深入分析了MFC程序的执行过程。 MFC程序执行过程 MFC程序的执行过程可以被…

    C 2023年5月30日
    00
  • Python与C/C++的相互调用案例

    当我们需要用Python完成一些与底层硬件交互或者需要进行大量数据处理时,往往会面临性能差的问题。这是因为Python作为解释型语言,运行效率较低。在这种情况下,我们可以考虑利用C/C++编写高效的底层代码,并将其与Python进行相互调用,从而实现Python的高效运行。 Python调用C/C++代码 Python可以通过扩展模块的方式调用C/C++代码…

    C 2023年5月23日
    00
  • 在Linux系统中使用GDB来调试C/C++程序的方法

    在Linux系统中使用GDB来调试C/C++程序的方法可以分为以下几个步骤: 1. 编译C/C++程序时添加编译选项 为了让程序在调试时保留符号表信息,需要在编译C/C++源代码时添加编译选项 -g。例如: $ gcc -g -o myprog myprog.c 这样编译出来的可执行文件中就包含了符号表信息,可以用于调试。 2. 启动GDB调试器 在终端中输…

    C 2023年5月24日
    00
  • C++ API功能设计的实现

    实现C++ API功能设计有以下几个步骤: 1.需求分析 需求分析是实现功能设计的第一个步骤,它是确保API能够满足用户需求的关键步骤。在需求分析阶段,需要先明确API所要实现的功能和API的入参和出参以及API的使用方法。 2.功能实现 根据需求分析结果,进行功能设计并进行实现。API的功能实现可能需要涉及到许多的技术,需要在函数的定义和实现过程中考虑技术…

    C 2023年5月22日
    00
  • Oracle 12C实现跨网络传输数据库详解

    Oracle 12C实现跨网络传输数据库详解 介绍 在Oracle 12C中,跨网络传输数据库是一项非常常见的任务。这通常通过Oracle数据泵实用程序完成。本文将详细介绍使用数据泵将数据库传输到不同计算机上所需的步骤。 步骤 步骤1:创建目标数据库 在目标计算机上创建一个空的数据库,并确保通过网络可以从源计算机访问该数据库。可以使用SQL Develope…

    C 2023年5月22日
    00
  • C语言用malloc创建一维数组

    当我们在C语言中需要动态分配一维数组时,我们可以使用malloc函数来进行分配。malloc函数会返回一个void类型的指针,我们需要将它强制类型转换成所需要的数组类型指针,以便后续的使用。 下面是使用malloc创建一维数组的完整攻略: 1. 分配内存空间 我们可以使用malloc函数来分配内存空间,其函数原型为: #include <stdlib.…

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