0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

学益得智能硬件 来源:学益得智能硬件 2023-09-05 17:05 次阅读

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

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

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

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

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

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





审核编辑:刘清

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

    关注

    1

    文章

    1618

    浏览量

    49047
  • 函数指针
    +关注

    关注

    2

    文章

    56

    浏览量

    3775

原文标题:对函数名取地址

文章出处:【微信号:学益得智能硬件,微信公众号:学益得智能硬件】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    函数指针指针函数的概念

    不少朋友会混淆“函数指针”和“指针函数”这两个概念,本文详细介绍一下。
    发表于 03-09 10:49 1147次阅读

    函数指针指针函数

    指针函数的声明方法为:类型名 *函数名(函数参数列表);其中,后缀运算符括号“()”表示这是一个函数,其前缀运算符
    发表于 01-22 19:28

    指向code区数组的指针不需要code关键字的声明?

    指向code区数组的指针不需要code 关键字的声明?
    发表于 11-02 06:16

    类成员函数与普通函数的区别研究

    本文的目的是研究类成员函数与普通函数之区别,以及不同调用方式之间的区别,进而通过内联汇编语句模仿特定的调用,从而完成
    发表于 09-15 14:52 32次下载

    使用指针调用函数产生 Hard Fault

    使用指针调用函数产生 Hard Fault
    发表于 12-07 17:52 0次下载

    函数指针指针函数定义

    函数指针指针函数,C语言学习中最容易混淆的一些概念,好好学习吧
    发表于 01-11 16:44 0次下载

    C语言指针函数函数指针详细介绍

    C语言指针函数函数指针详细介绍。。。。。。。
    发表于 03-04 15:27 5次下载

    c语言函数指针定义,指针函数函数指针的区别

     往往,我们一提到指针函数函数指针的时候,就有很多人弄不懂。下面就由小编详细为大家介绍C语言中函数指针
    发表于 11-16 15:18 3613次阅读

    理解函数指针函数指针数组、函数指针数组的指针

    理解函数指针函数指针数组、函数指针数组的指针
    的头像 发表于 06-29 15:38 1.5w次阅读
    理解<b class='flag-5'>函数</b><b class='flag-5'>指针</b>、<b class='flag-5'>函数</b><b class='flag-5'>指针</b>数组、<b class='flag-5'>函数</b><b class='flag-5'>指针</b>数组的<b class='flag-5'>指针</b>

    C语言进阶:函数指针的概念和使用方法

    函数指针是指向函数指针变量。 通常我们说的指针变量是指向一个整型、字符型或数组等变量,而函数
    发表于 05-02 06:17 5829次阅读

    函数指针的基本概念和语法

    函数指针是一种非常强大的编程工具,它可以让我们以更加灵活的方式编写程序。在本文中,我们将介绍 6 个函数指针的高级应用场景,并贴出相应的代码案例和解
    的头像 发表于 07-05 10:32 557次阅读

    函数指针的五大作用

    1,回调函数机制函数指针常用于实现回调函数通过函数指针
    的头像 发表于 12-06 08:00 1838次阅读
    <b class='flag-5'>函数</b><b class='flag-5'>指针</b>的五大作用

    函数指针指针函数是不是一个东西?

    函数指针的本质是指针,就跟整型指针、字符指针一样,函数指针
    的头像 发表于 01-03 16:35 496次阅读
    <b class='flag-5'>函数</b><b class='flag-5'>指针</b>和<b class='flag-5'>指针</b><b class='flag-5'>函数</b>是不是一个东西?

    函数指针与回调函数的应用实例

    通常我们说的指针变量是指向一个整型、字符型或数组等变量,而函数指针是指向函数函数指针
    的头像 发表于 03-07 11:13 373次阅读
    <b class='flag-5'>函数</b><b class='flag-5'>指针</b>与回调<b class='flag-5'>函数</b>的应用实例

    面试常考+1:函数指针指针函数、数组指针指针数组

    在嵌入式开发领域,函数指针指针函数、数组指针指针数组是一些非常重要但又容易混淆的概念。理解它
    的头像 发表于 08-10 08:11 691次阅读
    面试常考+1:<b class='flag-5'>函数</b><b class='flag-5'>指针</b>与<b class='flag-5'>指针</b><b class='flag-5'>函数</b>、数组<b class='flag-5'>指针</b>与<b class='flag-5'>指针</b>数组