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

