MST

星途 面试题库

面试题:C语言指针运算与函数指针

编写一个函数 `int calculate(int a, int b, int (*op)(int, int));`,该函数接受两个整数 `a` 和 `b`,以及一个函数指针 `op`,`op` 指向一个接受两个整数并返回一个整数的函数。在 `calculate` 函数中,通过函数指针 `op` 调用相应的函数来对 `a` 和 `b` 进行运算,并返回结果。另外,再编写两个简单的函数 `add(int a, int b)` 和 `subtract(int a, int b)`,分别用于加法和减法运算,并在 `main` 函数中调用 `calculate` 函数,分别传入 `add` 和 `subtract` 函数指针进行运算。请详细说明函数指针在这个过程中的运算原理以及如何通过指针运算实现函数的动态调用。
28.1万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试
#include <stdio.h>

// 加法函数
int add(int a, int b) {
    return a + b;
}

// 减法函数
int subtract(int a, int b) {
    return a - b;
}

// 计算函数
int calculate(int a, int b, int (*op)(int, int)) {
    return op(a, b);
}

int main() {
    int num1 = 5, num2 = 3;
    // 使用add函数指针调用calculate
    int resultAdd = calculate(num1, num2, add);
    printf("加法结果: %d\n", resultAdd);

    // 使用subtract函数指针调用calculate
    int resultSubtract = calculate(num1, num2, subtract);
    printf("减法结果: %d\n", resultSubtract);

    return 0;
}

函数指针运算原理及动态调用说明

  1. 函数指针定义:在C语言中,函数名实际上是函数的入口地址,函数指针是一种指向函数的指针变量。int (*op)(int, int) 定义了一个名为 op 的函数指针,它指向的函数接受两个 int 类型参数并返回一个 int 类型值。
  2. 传递函数指针:在 calculate 函数定义中,将函数指针 op 作为参数传递。在 main 函数中调用 calculate 时,分别传入 addsubtract 函数名,这里函数名隐式地转换为函数指针。
  3. 动态调用:在 calculate 函数内部,通过 op(a, b) 调用实际的函数。由于 op 可以指向不同的函数(如 addsubtract),这种方式实现了函数的动态调用,即根据传入的不同函数指针,calculate 函数可以执行不同的运算逻辑。这在程序需要根据不同条件选择不同操作时非常有用,增加了程序的灵活性和可扩展性。