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-elseswitch-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 以获取其他函数的结果。