- 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 - 主函数
- 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 - 函数指针
- C - 指向数组的指针
- C - 指向结构体的指针
- C - 指针链
- C - 指针与数组
- C - 字符指针和函数
- C - 空指针
- C - void指针
- C - 悬空指针
- C - 解引用指针
- C - 近、远和巨型指针
- C - 指针数组的初始化
- C - 指针与多维数组
- C语言中的字符串
- C - 字符串
- C - 字符串数组
- C - 特殊字符
- C语言中的结构体和联合体
- C - 结构体
- C - 结构体和函数
- C - 结构体数组
- C - 自引用结构体
- C - 查找表
- C - 点(.)运算符
- C - 枚举(或enum)
- C - 结构体填充和打包
- C - 嵌套结构体
- C - 匿名结构体和联合体
- C - 联合体
- C - 位域
- C - Typedef
- C语言中的文件处理
- C - 输入 & 输出
- C - 文件I/O (文件处理)
- C预处理器
- C - 预处理器
- 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)(function argument list)
示例
这是一个简单的C语言中的hello()函数:
void hello(){ printf("Hello World"); }
我们如下声明指向此函数的指针:
void (*ptr)() = &hello;
现在,我们可以使用此函数指针“(*ptr)();”来调用该函数。
函数指针示例
以下示例演示了如何声明和使用函数指针来调用函数。
#include <stdio.h> // Defining a function void hello() { printf("Hello World"); } // The main code int main() { // Declaring a function pointer void (*ptr)() = &hello; // Calling function using the // function poiter (*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\n", 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 for addition, 2 for subtraction // 3 for multiplication, 4 for division 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以获取其他函数的结果。