如何(*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 类型,如int
、void
、double
,甚至是"复合"类型,如int*
和"..."在第二组括号内可以是空的,也可以是其他"类型"的列表(,将其识别为函数指针的声明(或取消引用函数指针(。要获取底层函数"签名"(或调用(,只需删除第一组括号和包含的*
。因此,对于:类型名>
(*ptr_fun1)(20)
您可以阅读:
ptr_fun1(20)
并且,对于:
void (*ptr_fun1)(int);
您可以看到ptr_fun
具有以下签名:
void ptr_fun1(int);
我希望这能让事情更清楚一些。请随时要求进一步澄清和/或解释。