全球最实用的IT互联网信息网站!

AI人工智能P2P分享&下载搜索网页发布信息网站地图

当前位置:诺佳网 > 电子/半导体 > 嵌入式技术 >

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

时间:2023-09-05 17:05

人气:

作者:admin

标签: 编译器  函数指针 

导读:先来说下结论,不管是获取函数地址,还是通过函数指针调用函数,两种写法都可以,就用法上来说,没有什么区别,初学者也不必过多纠结。...

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

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

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(),但是一定要记住这种写法也只是一种简写形式。

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

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

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





审核编辑:刘清

温馨提示:以上内容整理于网络,仅供参考,如果对您有帮助,留下您的阅读感言吧!
相关阅读
本类排行
相关标签
本类推荐

CPU | 内存 | 硬盘 | 显卡 | 显示器 | 主板 | 电源 | 键鼠 | 网站地图

Copyright © 2025-2035 诺佳网 版权所有 备案号:赣ICP备2025066733号
本站资料均来源互联网收集整理,作品版权归作者所有,如果侵犯了您的版权,请跟我们联系。

关注微信