指向函数的指针 – 一种不同的声明方法
在读这个 (精神病学给出的答案)时,我理解了如何输入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?
如果func
被typedef
ed为函数指针,那么语句
func *fp=&test;
将会
func fp=&test;