Cprogramming 简明教程
Function Pointers in C
What is Function Pointer in C?
pointer in C 是一个存储另一个变量地址的变量。类似地,存储函数地址的变量称为 function pointer 或 pointer to a function 。当你想动态调用函数时,函数指针很有用。C 中的回调函数机制依赖于函数指针。
函数指针像普通指针一样指向代码。在函数指针中,函数名可用于获取函数地址。函数也可以作为参数传递,并可以从函数中返回。
Declaring a Function Pointer
你应该有一个将要声明其函数指针的 function 。要在 C 中声明一个函数指针,请编写一个包含其所指向函数的返回类型、指针名称和参数类型的声明语句。
Function Pointer Example
以下示例演示如何声明和使用函数指针来调用函数。
#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;
}
Function Pointer with Arguments
还可以为带有参数的函数声明函数指针。在函数声明期间,您需要将特定数据类型作为参数列表提供。
Understanding Function Pointer with Arguments
假设我们有一个名为 addition() 并带有两个参数的函数:
int addition (int a, int b){
return a + b;
}
为了为上述函数声明函数指针,我们使用两个参数:
int (*ptr)(int, int) = addition;
然后,我们可以通过其指针调用该函数,方法是传递所需的参数。
int z = (*ptr)(x, y);
完整代码如下:
Example of Function Pointer with Arguments
以下是完整代码。它展示了如何通过其指针调用函数:
#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
Pointer to Function with Pointer Arguments
当主机函数本身作为指针参数时,我们也可以声明函数指针。我们来看看这个示例:
Understanding Pointer to Function with Pointer Arguments
我们有一个 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);
Example of Pointer to Function with Pointer Arguments
以下是此示例的完整代码:
#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
Array of Function Pointers
你也可以按如下语法声明函数指针 array :
type (*ptr[])(args) = {fun1, fun2, ...};
Example of Array of Function Pointers
我们可以使用通过指针而不是 if-else 或 switch-case statements 动态调用函数的特性。看看以下示例:
#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 以获取其他函数的结果。