指向函数的指针 - 声明

时间:2016-04-12 05:42:13

标签: c pointers

在阅读this(精神病学给出的答案)时,我理解了如何键入def并调用函数指针。但是在考虑了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);
}

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

3 个答案:

答案 0 :(得分:5)

风格

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后面是一个坏主意。函数指针也不例外。

答案 1 :(得分:3)

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

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

另一种方法是输入指针,

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

答案 2 :(得分:1)

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

func *fp=&test; 

将是

func fp=&test;