"指向函数的指针"语法在 C 中如何工作?



如何(*ptr_fun1((10(和ptr_fun1(10(在下面的代码中是相同的

法典:

#include<stdio.h>
void fun1(int a)
{
printf("It is %dn",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("%dn%d",ptr_fun1(10),(*ptr_fun1)(20));
return 0;
}

输出

10
20

有人可以解释一下它是如何工作的。

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

首先,让我们考虑指向"简单"类型的指针(我们将以"int"类型为例(。在这种情况下,声明该类型的变量是微不足道的:int N;此外,声明指向int的指针也是微不足道的:int *pN;我们可以将第二个声明解释为"评估"*"运算符,这意味着"获取驻留在给定地址的对象"。因此,在int *pN中,我们声明"位于地址" pN"的对象是int

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

但是我们如何声明指向这样一个函数的指针呢?我们不能简单地应用与"简单"类型相同的逻辑(通过在前面加上*运算符(,如下所示:

int *pIFunc(int arg);

因为这将声明一个函数,该函数采用int参数并返回指向 int 的指针

因此,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);

我希望这能让事情更清楚一些。请随时要求进一步澄清和/或解释。

最新更新