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

广告