通过函数指针调用函数,需不需要加星号?

描述

关于函数指针,一直都有一个争论的话题:

通过函数指针调用函数,需不需要加星号?

 

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 


void test()
{


}


int main()
{
    printf("%lu
", sizeof(test));
    printf("%lu
", sizeof(&test));


    return 0;
}
  在64位系统中,这两个的结果一个是1,一个是8。 不过需要注意的是,很多编译器,不支持sizeof+函数名这种写法。 接下来就是通过函数指针调用函数,需不需要在指针前面加上星号?
pf();
(*pf)();
  C陷阱与缺陷这本书中也有提到:

 

fp是个函数指针,*fp就是该指针所指向的函数,所以(*fp)()就是调用函数的方式。C标准允许程序员将上式简写为fp(),但是一定要记住这种写法也只是一种简写形式。

这么看来,好像加上星号更合适一些。

通过函数指针调用函数,加不加星号,以及获取函数的地址,需要使用 & 运算符,这个跟对数组名的操作还不一样。

对数组名取地址和不取地址含义完全不一样,使用的时候也有很大的区别。但是对函数名取地址和不取地址,使用的时候基本没有区别。





审核编辑:刘清

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分