C语言指针(五)--函数指针

在第四篇关于链表的文章中读者可以通过实现单向链表了解简单的指针应用。但是,在这之中出现了函数指针和空指针。在这篇文章中将对这两方面的内容做讨论。
说实话我现在我快崩溃了,这是我第三遍写这篇文章,前两遍都是在我正要发布的时候莫名其妙的没有啦。所以。。。。。。先提三个问题
1.定义一个函数指针,返回值为int参数为空。
2.定义一个函数指针,返回值int参数为int。
3.定义一个返回int指针的函数参数为int。
4.定义一个返回函数指针的函数参数为空,返回的函数指针参数和返回值都是int。
对于C语言基础较好的读者,前两个问题应该不成问题,但是第三个问题就不是所有读者都可以搞定了。

1.int (*fun)(void);
2 int (*fun)(int);
3.int* fun(int prg)
{}
4.?

我们观察前两个问题的答案,可能会发现函数指针的定义其实就是在函数定义的基础之上把函数名用括号括起来然后在函数名前加一个星号。
所以第四个问题的答案可能是这样的

int (*fun)(int) function(void)
{}

可是我们观察第四个问题答案发现返回的指针并没有指针名所以应该把上面的定义改写成这样

int (*fun(void))(int)
{}

至于为什么是这样而不是这样

int (*fun(int))(void)
{}

其实这要用*号和()的优先级来解释,同时我参考了Linux中signal函数的定义原型。正因为这样的定义太让人费解,所以我强烈建议使用typedef。

typedef (int (*fun)(int)) newdef;
newdef fun(void)
{}

当然为了显示您的能力你也可以定义返回值和参数都是函数指针的函数。
下面来简单聊一下空指针,其实经常使用C语言的用户会发现空指针经常会出现在回调函数的参数列表中。这样做的好处是在实现回调函数时用户可以给回调函数传入任意参数以达到灵活实现功能的目的。例如:

void function(void* prg)
{
     int *p = (int *)prg;
     .......
}

灵活的定义空指针变量和将空指针作为函数参数,可以使自己的代码更加灵活。当然,不明确的类型也有其弊端。

发布了23 篇原创文章 · 获赞 27 · 访问量 1161

猜你喜欢

转载自blog.csdn.net/BLUCEJIE/article/details/103538410