下面的代码(* 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
有人可以解释一下它的工作原理吗。
答案 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)(...);
(其中int
,void
,double
,甚至是int*
之类的“复合”类型,并且第二组方括号内的“ ...”可以为空,也可以是其他“类型”的列表),请将其识别为函数的声明指针(或取消引用函数指针)。要获取基础功能“签名”(或调用),只需除去第一组括号和其中包含的*
。因此,对于:
(*ptr_fun1)(20)
您可以阅读:
ptr_fun1(20)
而且,对于:
void (*ptr_fun1)(int);
您会看到ptr_fun
具有以下签名:
void ptr_fun1(int);
我希望这可以使事情变得更清楚。随时要求进一步的澄清和/或解释。