关于函数指针,一直都有一个争论的话题:
通过函数指针调用函数,需不需要加星号?
void func() { } void (*pf)() = func; pf(); (*pf)();同样,获取函数地址的时候,需不需要对函数名做取地址的操作?
void func() { } void (*pf)() = func; void (*pf)() = &func;先来说下结论,不管是获取函数地址,还是通过函数指针调用函数,两种写法都可以,就用法上来说,没有什么区别,初学者也不必过多纠结。
void (*pf)() = func;那加上取地址操作符又是什么意思?
void (*pf)() = &func;C和指针这本书中这样解释:
初始化表达式中的 & 操作符是可选的,因为函数名被使用时总是由编译器把它转换成函数指针,取地址操作符只是显示的说明了编译器将隐式执行的任务。
这样看来,加不加取地址好像还真有点区别,一个表示函数,一个表示函数的地址,只不过在这个赋值运算中,编译器把函数名转换成了地址。
void (*pf)() = func; //函数 void (*pf)() = &func; //函数的地址要说他俩的区别,我能想到的就是结合sizeof来计算类型的长度:
#include在64位系统中,这两个的结果一个是1,一个是8。 不过需要注意的是,很多编译器,不支持sizeof+函数名这种写法。 接下来就是通过函数指针调用函数,需不需要在指针前面加上星号?void test() { } int main() { printf("%lu ", sizeof(test)); printf("%lu ", sizeof(&test)); return 0; }
pf(); (*pf)();C陷阱与缺陷这本书中也有提到:
fp是个函数指针,*fp就是该指针所指向的函数,所以(*fp)()就是调用函数的方式。C标准允许程序员将上式简写为fp(),但是一定要记住这种写法也只是一种简写形式。
这么看来,好像加上星号更合适一些。
通过函数指针调用函数,加不加星号,以及获取函数的地址,需要使用 & 运算符,这个跟对数组名的操作还不一样。
对数组名取地址和不取地址含义完全不一样,使用的时候也有很大的区别。但是对函数名取地址和不取地址,使用的时候基本没有区别。
审核编辑:刘清
全部0条评论
快来发表一下你的评论吧 !