如何在C中使用“函数指针”语法?

时间:2019-10-12 05:38:03

标签: c function pointers

下面的代码(* ptr_fun1)(10)和ptr_fun1(10)如何相同

代码:

#include<stdio.h>
void fun1(int a)
{
     printf("It is %d\n",a);
}
int main()
{
  void (*ptr_fun1)(int);
  ptr_fun1 = fun1;
/*
   ex-
        ptr_fun1    fun1    
        +----+      +-----+
        +1000+      +code +
        +----+      +-----+
         1234        1000
        fun1(10); <=> ptr_fun1(10); //how
*/
  printf("%d\n%d",ptr_fun1(10),(*ptr_fun1)(20));
  return 0;
}

输出

10
20

有人可以解释一下它的工作原理吗。

1 个答案:

答案 0 :(得分:1)

C(和C++)中声明(和使用)函数指针的语法是初学者最困惑的语言之一。我将在这里尝试解释一下。

首先,让我们考虑指向“简单”类型的指针(以“ int”类型为例)。在这种情况下,声明类型的变量很简单:int N;而且,声明指向int的指针也很简单:int *pN;我们可以用“求值”来解释第二个声明。 ''*'运算符,表示“获取位于给定地址的对象”。因此,在int *pN中,我们声明“位于地址“ pN”的对象是int

对于函数,这不是那么简单!以一个以int作为其(唯一)参数并返回int值:int IFunc(int arg);的函数为例。这也非常简单。

但是我们怎么能声明一个指向这样一个函数的指针呢?我们 不能 简单地应用与“简单”类型相同的逻辑(通过使用*运算符),如下所示:

int *pIFunc(int arg);

因为这将声明一个函数,该函数需要一个int arg并返回一个指向整数的指针

因此,C语言的早期实现者必须提出更好的建议-完全明确。因此,他们决定使用将“ * NAME”部分放在括号中的语法,以将“取消引用”操作与函数的定义隔离开来:

int (*pIFunc)(int arg);

因此,当面对任何看起来像这样的东西时:< typename > (*Name1)(...);(其中是任何允许的C类型,例如intvoiddouble ,甚至是int*之类的“复合”类型,并且第二组方括号内的“ ...”可以为空,也可以是其他“类型”的列表),请将其识别为函数的声明指针(或取消引用函数指针)。要获取基础功能“签名”(或调用),只需除去第一组括号和其中包含的*。因此,对于:

(*ptr_fun1)(20)

您可以阅读:

ptr_fun1(20)

而且,对于:

void (*ptr_fun1)(int);

您会看到ptr_fun具有以下签名:

void ptr_fun1(int);

我希望这可以使事情变得更清楚。随时要求进一步的澄清和/或解释。