MST

星途 面试题库

面试题:C语言指针变量值与类型:函数指针的复杂应用

编写一个计算器程序,支持加、减、乘、除运算。要求使用函数指针数组来实现不同运算的选择。用户通过输入运算符(如'+', '-', '*', '/'),程序调用相应的函数进行运算并输出结果。在此过程中,分析函数指针的类型、值以及如何将其存储在数组中,并且说明函数指针在这种场景下的优势和可能出现的问题。
38.0万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试

代码实现

#include <stdio.h>
#include <stdlib.h>

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

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

// 定义乘法函数
double multiply(double a, double b) {
    return a * b;
}

// 定义除法函数
double divide(double a, double b) {
    if (b == 0) {
        printf("除数不能为零\n");
        exit(EXIT_FAILURE);
    }
    return a / b;
}

int main() {
    double num1, num2;
    char op;

    // 函数指针类型定义
    typedef double (*Operation)(double, double);

    // 函数指针数组,存储不同运算函数的指针
    Operation operations[4] = {add, subtract, multiply, divide};

    printf("请输入操作数和运算符 (格式: num1 op num2): ");
    if (scanf("%lf %c %lf", &num1, &op, &num2) != 3) {
        printf("输入格式错误\n");
        return 1;
    }

    // 根据运算符选择相应的函数进行运算
    switch (op) {
        case '+':
            printf("结果: %.2f\n", operations[0](num1, num2));
            break;
        case '-':
            printf("结果: %.2f\n", operations[1](num1, num2));
            break;
        case '*':
            printf("结果: %.2f\n", operations[2](num1, num2));
            break;
        case '/':
            printf("结果: %.2f\n", operations[3](num1, num2));
            break;
        default:
            printf("不支持的运算符\n");
    }

    return 0;
}

函数指针类型、值及存储分析

  1. 函数指针类型typedef double (*Operation)(double, double); 定义了一个函数指针类型 Operation,它指向的函数接受两个 double 类型的参数,返回一个 double 类型的值。
  2. 函数指针值:函数指针的值是函数在内存中的地址。例如,add 函数名在作为函数指针使用时,其值就是 add 函数在内存中的起始地址。
  3. 存储在数组中Operation operations[4] = {add, subtract, multiply, divide}; 将不同运算函数的指针存储在数组 operations 中。数组的每个元素都是一个函数指针,指向相应的运算函数。

函数指针在这种场景下的优势

  1. 代码简洁:通过函数指针数组,可以使用一个统一的方式来调用不同的运算函数,减少了大量重复的 if - elseswitch - case 代码。
  2. 可扩展性:如果需要添加新的运算,只需要添加相应的函数,并将其指针添加到函数指针数组中,而不需要对主程序的核心逻辑进行大量修改。
  3. 灵活性:可以根据运行时的条件动态选择要执行的函数,使得程序具有更高的灵活性。

可能出现的问题

  1. 空指针问题:如果函数指针数组中的某个元素未正确初始化(即为空指针),调用该指针时会导致程序崩溃。
  2. 类型不匹配:如果定义的函数指针类型与实际指向的函数类型不匹配,会导致未定义行为。例如,函数指针指向的函数参数个数或类型与定义的函数指针类型不一致。
  3. 内存管理:虽然函数指针本身的内存管理相对简单,但如果函数内部涉及到动态内存分配,在函数调用结束后需要确保正确释放内存,否则可能导致内存泄漏。