函数指针一些知识
(1) , 在mj下拉刷新中遇到了定义的一个宏,看起来比较晦涩,如下
#define msgSend(...) ((void (*)(void *, SEL, UIView *))objc_msgSend)(__VA_ARGS__)
其实就是把objc_msgSend函数指针强制转换成另一种类型((void (*)(void *, SEL, UIView *)))的函数指针,
所以这个宏表示的就是一个个函数指针
(void (*)(void *, SEL, UIView *))这一坨其实表示的是一个函数指针(指向一个函数的指针,这个函数返回值为void,有3个参
数),前面这一坨的意思就是把objc_msgSend这个函数指针转换成这一坨的指针类型。这样的好处就是可以限制这个宏接受的3个参数必须是这一坨中的3个参数。
调用的时候,可以这么调用:
objc_msgSend(ivar1,ivar2,ivar3);
这与(*objc_msgSend)(ivar1,ivar2,ivar3);是等价的。
下面分析为什么他们是等价的?
void (*funcPtr)(); // 这是一个函数指针
void *funcPtr(); // 这是一个函数
主要取决于运算符的优先级,
funcPtr是应该先与坐边的*结合还是与右边的()结合,
因为函数运算符()
的优先级要高于单目运算符*,所以如
果没有括号那就先与()结合,那么它就是一个函数。
在《C陷阱与缺陷》中有这样一段描述:
fp是一个函数指针,那么*fp就是该指针所指向的函数,所以(*fp)()就是调用该函数的方式。ANSI C标准允许程序员将上式简写为fp(),但是一定要记住这种写法只是一种简写形式。
在表达式void (*func)()