根据 ISO/IEC 20116.3.2.1/4
A function designator is an expression that has function type. Except when
it is the operand of the sizeof operator, the _Alignof operator,65)
or the unary & operator, **a function designator with type
‘‘function returning type’’ is converted to an expression that has
type ‘‘pointer to function returning type’’ ** .
再次6.7.6.3 Function declarators
长篇大论。
现在这是什么意思?当我们用它的声明符调用一个函数时,它被转换为该类型的指针,所以两者都需要表示同一个函数。即 foo 和 &foo 是一样的。你怎么检查这个?我这样做的愚蠢方式是(请不要这样做)
int s(){return 100;}
int a = &s;
int a = s;
现在两者都给出相同的错误!
现在你的问题
“我们有一个指向整数数组的指针”这意味着它是类型的int (*)[]
,所以当我们想要访问第二个元素时,例如,我们需要(*ptr)[1]
. //@1
相同的规则适用于函数指针,例如
int (*p)(void) //`p` pointer to function type
现在假设我们是否可以拥有函数数组(我们不能)并且我们需要一个指向我们需要的这种类型数组的指针
--> `int ((*fp)[5])(void)` //which is not possible but lets assumme we can,
然后我们需要访问第二个函数,例如 as (*fp)[1]
。这类似于@1。
但正如标准所说
函数声明器被转换为指向该类型函数的指针,这意味着
如果我们有一个函数说
int foo()
{
return 100;
}
我们可以通过以下方式调用这个函数
1) foo()
2) (&foo)()
3) (*foo)()
1)
and 与相同2)
,3)
因为 1) 被转换为3)
(如标准),并且2)
a 可能int (*fp)(void) = &foo
与 int 相同(*fp)(void) = foo;