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