函数指针中是星号可选吗?

时间:2013-07-28 23:28:42

标签: c function

我使用的代码有这样的陈述:

typedef void  ( udp_data_notify )(OS_FIFO * pfifo, WORD port); 

这看起来像是udp_data_notify的函数指针的声明,但是没有*。它仍然可以是没有星号的函数指针吗?

以下是使用udp_data_notify的声明:

void RegisterUDPFifoWithNotify( WORD dp, OS_FIFO *pnewfifo , udp_data_notify * nudp)

任何有关正在发生的事情的帮助都将不胜感激!

3 个答案:

答案 0 :(得分:4)

typedef,例如:

typedef void name(int);

name周围的括号是冗余的)将name定义为函数的类型,而不是函数指针。那将是:

typedef void (*pname)(int);

你可能想知道它们有什么用处。好吧,除了声明指针之外,函数类型不是很有用:

name *pointer_to_function;

使用其他typedef可以说这更具可读性:

pname pointer_to_function;

那是因为你无法定义类型函数的变量。如果你尝试,你只需编写一个函数的原型,但语法相当混淆:

name foo;   //declaration (prototype), not variable
void foo(int x) //definition
{
}

但请注意,您无法使用typedef来定义函数:

name foo {} //syntax error!

答案 1 :(得分:3)

如前所述,typedef声明了函数类型的别名。如果要使用它来声明函数指针,则需要星号(udp_data_notify* x)。没有星号(udp_data_notify x)的声明将是一个函数声明,除了一个特殊情况。在参数中使用时,函数类型会自动转换为相应的函数指针类型:

typedef void F(void);
void foo(F a, F* b) // special case; a and b are both function pointers
{
    F c; // function declaration
    F* d; // function pointer
}

答案 2 :(得分:0)

您展示的typedef声明udp_data_notify是函数类型的别名。然后参数声明udp_data_notify *nudp声明nudp是指向该类型函数的指针。这里没有函数调用。

关于函数调用运算符(postfix ()),指定被调用函数的表达式必须是指向函数的指针。当您正常调用函数而没有指针(例如sqrt(2))时,该函数会自动转换为指针。所以sqrt(2)实际上是(&sqrt)(2)。当您使用指针调用函数时,调用已经是正确的形式。