如何理解“(*****************p)();”在 C
How to understand "(*****************p)();" in C
我是大学生。我在Expert C Programming看到这种写法。不明白为什么函数指针可以这样调用
#include <stdio.h>
void fun(){}
int main(int argc, char const *argv[])
{
void (*p)() = fun;
(************************************************************************p)();
return 0;
}
之所以可行,是因为函数指示符和函数指针的工作方式。
取消引用函数指针时,结果是一个函数指示符。但是,在大多数情况下,函数指示符会转换为函数指针。
此行为在 C standard:
的第 6.3.2.1p4 节中有详细说明
A function designator is an expression that has function type.
Except when it is the operand of the sizeof
operator, the _Alignof
operator, 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’’.
这意味着给定的函数指针 p
,*p
是一个函数指示符,但在任何使用它的地方都会被转换回函数指针。这意味着函数指针可以(本质上)无限次取消引用并产生相同的结果。
此外,函数调用运算符()
实际上需要一个函数指针作为它的参数。因此,如果您要执行 fun()
,fun
将首先根据上述规则转换为函数指针,然后将函数调用运算符应用于该函数指针。
将它们放在一起,这就是这段代码所展示的内容。
根据 C 标准(6.3.2.1 左值、数组和函数指示符)
4 A function designator is an expression that has function type.
Except when it is the operand of the sizeof operator65) 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.5.3.2 地址和间接运算符)
4 The unary * operator denotes indirection. If the operand points to
a function, the result is a function designator; if it points to an
object, the result is an lvalue designating the object. If the operand
has type ‘‘pointer to type’’, the result has type ‘‘type’’. If an
invalid value has been assigned to the pointer, the behavior of the
unary * operator is undefined.
因为 p
是一个指向函数的指针,所以表达式 *p
表示指针 p
指向的函数。如果将一元运算符 *
应用于表达式 *p
,例如 **p
,则表达式 *p
获得的函数指示符将隐式转换为指向函数和表达式的指针**p
再次为运算符 *
.
的其他应用生成函数指示符等
我是大学生。我在Expert C Programming看到这种写法。不明白为什么函数指针可以这样调用
#include <stdio.h>
void fun(){}
int main(int argc, char const *argv[])
{
void (*p)() = fun;
(************************************************************************p)();
return 0;
}
之所以可行,是因为函数指示符和函数指针的工作方式。
取消引用函数指针时,结果是一个函数指示符。但是,在大多数情况下,函数指示符会转换为函数指针。
此行为在 C standard:
的第 6.3.2.1p4 节中有详细说明A function designator is an expression that has function type. Except when it is the operand of the
sizeof
operator, the_Alignof
operator, 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’’.
这意味着给定的函数指针 p
,*p
是一个函数指示符,但在任何使用它的地方都会被转换回函数指针。这意味着函数指针可以(本质上)无限次取消引用并产生相同的结果。
此外,函数调用运算符()
实际上需要一个函数指针作为它的参数。因此,如果您要执行 fun()
,fun
将首先根据上述规则转换为函数指针,然后将函数调用运算符应用于该函数指针。
将它们放在一起,这就是这段代码所展示的内容。
根据 C 标准(6.3.2.1 左值、数组和函数指示符)
4 A function designator is an expression that has function type. Except when it is the operand of the sizeof operator65) 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.5.3.2 地址和间接运算符)
4 The unary * operator denotes indirection. If the operand points to a function, the result is a function designator; if it points to an object, the result is an lvalue designating the object. If the operand has type ‘‘pointer to type’’, the result has type ‘‘type’’. If an invalid value has been assigned to the pointer, the behavior of the unary * operator is undefined.
因为 p
是一个指向函数的指针,所以表达式 *p
表示指针 p
指向的函数。如果将一元运算符 *
应用于表达式 *p
,例如 **p
,则表达式 *p
获得的函数指示符将隐式转换为指向函数和表达式的指针**p
再次为运算符 *
.