【问题标题】:Logic behind calling function by using "Pointer to a function"使用“指向函数的指针”调用函数背后的逻辑
【发布时间】:2019-07-24 12:41:57
【问题描述】:

假设有一个指针f 声明给某个函数,比如int foo(int):

int (*f)(int)=foo;

同时提到使用这个作为参数传递给其他函数的 ponter 来调用 foo() 函数。 我遇到了一个声明,说这两个

y=(*f)(x) 和

y=f(x)

在 C 中相同,调用函数foo()....(x 和 y 是 int 类型)。

对于数组,我知道如果 p 是指向任何数组 a 的指针。

p[i]=*(p+i)=*(&a[0]+i)=*(a+i)=a[i].

所以写p[i] 和*(p+i) 是一回事。但我不会得到“指向函数”案例的逻辑。 y=(*f)(x) 和 y=f(x) 如何相同?在“指向数组的指针”的情况下,是否有任何公式可以理解这一点?

【问题讨论】:

  • 不需要公式就能理解。
  • 那么这只是我必须记住的规则吗?
  • C11 标准草案 n1570:6.5.3.2 地址和间接运算符 4 一元 * 运算符表示间接。如果操作数指向函数,则结果是函数指示符 [...] 6.3 转换 6.3.2 其他操作数 6.3.2.1 左值、数组和函数指示符 4 函数指示符是具有函数类型的表达式。除非它是 sizeof 运算符、_Alignof 运算符,65) 或一元 & 运算符的操作数,否则类型为“函数返回类型”的函数指示符将转换为类型为“指向函数返回类型的指针”的表达式''。
  • @Someprogrammerdude 正如我的标准引文所示,你有它倒退。函数指示符在被调用之前被转换为pointer to function。参见 n1570:6.5.2.2 函数调用 1 表示被调用函数的表达式 92) 应具有指向函数的类型指针,该函数返回 void 或返回数组类型以外的完整对象类型。

标签: c arrays pointers function-pointers pointer-to-pointer


【解决方案1】:

以前的 ANSI C 曾经要求您在调用函数指针之前取消引用它们。

当 C 语言标准化时,人们发现除了调用函数指针外,你无能为力(指针算术对函数指针没有意义——函数指针指向汇编指令块的长度)其中取决于具体函数,而不是函数类型。这也是你不能有函数数组的原因)所以f(x) 等同于(*f)(x)(甚至(****f)(x) 或(**&**f)(x) 和各种其他组合)只要f 是一个函数或一个单独的间接函数指针(如果它是一个指向函数指针的指针,您至少需要一个* 等多个间接指针)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-16
    • 2011-07-10
    • 2013-01-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多