C 语言编程教程

C 语言首页

C 语言基础

C 语言概述 C 语言特性 C 语言发展历史 C 语言下载安装和环境配置 C 语言程序结构 C 语言 Hello World C 编译过程 C 注释 C 标记 C 关键字 C 标识符 C 用户输入 C 基本语法 C 数据类型 C 变量 C 整数提升 C 类型转换 C 类型转换 C 布尔值

C 语言中的常量和文字

C 常量 C 字面量 C 转义序列 C 格式说明符

C 语言中的运算符

C 运算符 C 算术运算符 C 关系运算符 C 逻辑运算符 C 位运算符 C 赋值运算符 C 一元运算符 C 递增和递减运算符 C 三元运算符 C sizeof 运算符 C 运算符优先级 C 其他运算符

C 语言中的决策

C 决策 C if 语句 C if...else 语句 C 嵌套 if 语句 C switch 语句 C 嵌套 switch 语句

C 语言中的循环

C 循环 C While 循环 C For 循环 C Do...while 循环 C 嵌套循环 C 无限循环 C Break 语句 C Continue 语句 C goto 语句

C 语言中的函数

C 函数 C Main 函数 C 按值调用函数 C 按引用调用函数 C 嵌套函数 C 可变参数函数 C 用户定义函数 C 回调函数 C return 语句 C 递归

C 语言中的作用域规则

C 作用域规则 C 静态变量 C 全局变量

C 语言中的数组

C 数组 C 数组的属性 C 多维数组 C 将数组传递给函数 C 从函数返回数组 C 可变长度数组

C 语言中的指针

C 指针 C 指针和数组 C 指针的应用 C 指针运算 C 指针数组 C 指向指针的指针 C 将指针传递给函数 C 从函数返回指针 C 函数指针 C 指向数组的指针 C 指向结构体的指针 C 指针链 C 指针 vs 数组 C 字符指针和函数 C NULL 指针 C void 指针 C 悬垂指针 C 解引用指针 C Near、Far 和 Huge 指针 C 指针数组的初始化 C 指针与多维数组

C 语言中的字符串

C 字符串 C 字符串数组 C 特殊字符

C 语言的结构体和联合

C 结构体 C 结构体和函数 C 结构体数组 C 自引用结构 C 查找表 C 点 (.) 运算符 C 枚举(或 enum) C 结构填充和打包 C 嵌套结构 C 匿名结构和联合 C 联合 C Bit 位字段 C Typedef

C 语言中的文件处理

C 输入和输出 C 文件 I/O(文件处理)

C 语言中的预处理器

C 预处理器 C #pragma 编译指示 C 预处理器操作符 C 宏 C 头文件

C 语言中的内存管理

C 内存管理 C 内存地址 C 存储类

C 其他主题

C 错误处理 C 可变参数 C 命令执行 C 数学函数 C static 静态关键字 C 随机数生成 C 命令行参数

C 语言编程资源

C 语言问题与解答答案 C 语言快速指南 C 语言速查表 C 语言实用资源 C 语言讨论


C 语言中的函数指针

C 语言中的函数指针是什么?

C 语言中的指针是一个存储另一个变量地址的变量。同样,存储函数地址的变量称为函数指针或指向函数的指针。当需要动态调用函数时,函数指针非常有用。C 语言中的回调函数机制依赖于函数指针。

函数指针像普通指针一样指向代码。在函数指针中,可以使用函数名称来获取函数地址。函数也可以作为参数传递,也可以从函数返回。

声明函数指针

您应该有一个函数,您将要声明其函数指针。要在 C 语言中声明函数指针,请编写一个声明语句,其中包含函数的返回类型、指针名称和参数类型。

声明语法

以下是声明函数指针的语法:

function_return_type(*Pointer_name)(函数参数列表)

示例

以下是一个简单的 C 语言 hello() 函数 -

void hello(){
    printf("Hello World");
}

我们声明指向该函数的指针如下 -

void (*ptr)() = &hello;

现在我们可以借助函数指针"(*ptr)();"来调用该函数。

函数指针示例

以下示例演示了如何声明并使用函数指针来调用函数。

#include <stdio.h>

// 定义函数
void hello() { printf("Hello World"); }

// main 代码
int main() {
    // 声明函数指针
    void (*ptr)() = &hello;
    
    // 使用函数指针调用函数
    // 函数指针
    (*ptr)();
    
    return 0;
}

输出

运行此代码时,将产生以下输出 -

Hello World

注意:与普通的数据指针不同,函数指针指向代码。我们可以使用函数名作为其地址(就像数组一样)。因此,指向函数 hello() 的指针也可以声明如下:-

void (*ptr)() = hello;

带参数的函数指针

也可以为带参数的函数声明函数指针。在声明函数时,需要提供具体的数据类型作为参数列表。

理解带参数的函数指针

假设我们有一个名为 addition() 的函数,它有两个参数:-

int addition (int a, int b){

   return a + b;
}

要为上述函数声明一个函数指针,我们使用两个参数 -

int (*ptr)(int, int) = addition;

然后我们可以通过传递所需参数,通过函数指针调用该函数 -

int z = (*ptr)(x, y);

尝试以下完整代码 -

带参数的函数指针示例

以下是完整代码。它展示了如何通过函数指针调用函数 -

#include <stdio.h>

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

int main(){

   int (*ptr)(int, int) = addition;
   int x = 10, y = 20;
   int z = (*ptr)(x, y);

   printf("Addition of x: %d and y: %d = %d", x, y, z);
   
   return 0;
}

输出

运行此代码时,将产生以下输出 -

Addition of x: 10 and y: 20 = 30

带有指针参数的函数指针

当宿主函数本身作为指针参数时,我们也可以声明一个函数指针。让我们看这个例子 -

理解带有指针参数的函数指针

我们有一个 swap() 函数,它借助指针来交换"x"和"y"的值 -

void swap(int *a, int *b){
   int c;
   c = *a;
   *a = *b;
   *b = c;
}

按照声明函数指针的语法,可以如下声明:-

void (*ptr)(int *, int *) = swap;

要交换"x"和"y"的值,请将它们的指针传递给上述函数指针:-

(*ptr)(&x, &y);

带有指针参数的函数指针示例

以下是此示例的完整代码:-

#include <stdio.h>

void swap(int *a, int *b){
   int c;
   c = *a;
   *a = *b;
   *b = c;
}

int main(){
   
   void (*ptr)(int *, int *) = swap;
   
   int x = 10, y = 20;
   printf("Values of x: %d and y: %d before swap
", x, y);
   
   (*ptr)(&x, &y);
   printf("Values of x: %d and y: %d after swap", x, y);
   
   return 0;
}

输出

Values of x: 10 and y: 20 before swap
Values of x: 20 and y: 10 after swap

函数指针数组

您还可以按照以下语法声明一个函数指针数组:

type (*ptr[])(args) = {fun1, fun2, ...};

函数指针数组示例

我们可以使用指针动态调用函数的特性,而不是if-else或switch-case 语句。请看以下示例 -

#include <stdio.h>

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

float subtract(int a, int b){
   return a - b;
}

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

float divide(int a, int b){
   return a / b;
}

int main(){

    float (*ptr[])(int, int) = {add, subtract, multiply, divide};
    
    int a = 15, b = 10;
    
    // 1 表示加法,2 表示减法
    // 3 表示乘法,4 表示除法
    int op = 3;
    
    if (op > 5) return 0;
    printf("Result: %.2f", (*ptr[op-1])(a, b));
    
    return 0;
}

输出

运行代码并检查其输出 −

Result: 150.00

将 op 变量的值更改为 1、2 或 4 以获取其他函数的结果。