指向函数的指针 – 一种不同的声明方法

在读这个 (精神病学给出的答案)时,我理解了如何输入type并调用函数指针。 但在考虑了typedef之后,我尝试了一点,并且能够以这种方式调用函数:

typedef void func(unsigned char); void test(unsigned char a); int main() { unsigned char b=0U; func *fp=&test; while(1) { fp(b); b++; } } void test(unsigned char a) { printf("%d",a); } 

我不明白使用函数指针语法和这种方法有什么区别? 两者似乎几乎产生相同的function。

风格

 typedef void func_t (void); ... funct_t* fp; 

是声明函数指针的最明智的方法之一。 清除因为它与C的其余指针语法一致。

它相当于略低的可读性

 typedef void (*func_t)(void); func_t fp; 

反过来相当于可读性差得多

 void (*fp)(void); 

当您将这些作为参数传递给函数时,第一种样式的优势变得显而易见:

 1) void sort (func_t* callback); // very clear and readable! 2) void sort (func_t callback); // hmm what is this? passing by value? 3) void sort (void(*callback)(void)); // unreadable mess 

通常,将指针语法隐藏在typedef后面是一个坏主意。 函数指针也不例外。

您正在使用声明创建一个函数指针,即

 func *fp = &test; // fp is a function pointer! 

另一种方法是输入指针,

 typedef void (*func)(unsigned char); func fp = &test; // Notice, no '*' in the declaration? 

如果functypedef ed为函数指针,那么语句

 func *fp=&test; 

将会

 func fp=&test;