【发布时间】: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