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

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

3天内不再提示

函数指针的使用简述

嵌入式应用开发 来源:嵌入式应用开发 作者:嵌入式应用开发 2022-09-09 08:56 次阅读

函数指针在Linux内核和C语言开发中用的非常多,而且在设计操作系统的时候也会用到,因此这里将详细讲解函数指针。既然函数指针也是指针,那函数指针也占用4个字节(32位编译器)。下面以一个简单的例子说明:

#include 

int  add(int a,int b)
{
    return a+b;
}

int main(int argc, char **argv)
{
    int (*p)(int,int);
    p=add;
    printf("add(10,20)=%d\n",(*p)(10,20));
    return 0;
}
pYYBAGMZ4zOAHKm3AAAxVPPAzsw888.png

函数指针的解引操作与普通的指针有点不一样,对于普通的指针而言,解引只需要根据类型来取出数据即可,但函数指针是要调用一个函数,其解引不可能是将数据取出,实际上函数指针的解引本质上是执行函数的过程,只是这个执行函数是使用的call指令并不是之前的函数,而是函数指针的值,即函数的地址。其实执行函数的过程本质上也是利用call指令来调用函数的地址,因此函数指针本质上就是保存函数执行过程的首地址。

为了确认函数指针本质上是传递给call指令一个函数的地址,下面用一个简单例子说明:

pYYBAGMZ41mANU1vAAMGJLZxatQ810.png

上面是编译后的汇编指令,可以看到,使用函数指针来调用函数时,其汇编指令多了如下:

0x4015e3    mov    DWORD PTR [esp+0xc],0x4015c0
0x4015eb    mov    eax,DWORD PTR [esp+0xc]
0x4015ef    call   eax

分析:第一行mov指令将立即数0x4015c0赋值给寄存器esp+0xc的地址内存中,然后将寄存器esp+0xc地址的值赋值给寄存器eax(累加器),然后调用call指令,此时pc指针将会指向add函数,而0x4015c0正好是函数add的首地址,这样就完成了函数的调用。细心的读者是否发现一个有趣的现象,上述过程中函数指针的值和参数一样是被放在栈帧中,这样看起来就是一个参数传递的过程,因此可以看到,函数指针最终还是以参数传递的形式传递给被调用的函数,而这个传递的值正好是函数的首地址。

从上面可以看到函数指针并不是和一般的指针一样可以操作内存,因此作者觉得函数指针可以看作是函数的引用申明。

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

    关注

    87

    文章

    11219

    浏览量

    208872
  • C语言
    +关注

    关注

    180

    文章

    7597

    浏览量

    136119
  • 函数指针
    +关注

    关注

    2

    文章

    56

    浏览量

    3775
收藏 人收藏

    评论

    相关推荐

    函数指针指针函数的概念

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

    C语言中指针函数函数指针的概念及应用示例

    在C语言中,指针函数函数指针是强大且常用的工具。它们允许我们以更灵活的方式处理函数和数据,进而扩展程序的功能。
    发表于 08-16 16:14 717次阅读

    一文详解函数指针与回调函数

    函数指针是指向函数指针变量。它允许我们将函数作为参数传递给其他函数或将
    发表于 08-22 10:36 475次阅读

    函数指针指针函数定义

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

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

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

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

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

    ARM的函数指针指针函数的区别和用法

    在学习arm过程中发现这“指针函数”与“函数指针”容易搞错,所以今天,我自己想一次把它搞清楚,找了一些资料,和大家的一些总结,整理到此。和大家分享。
    的头像 发表于 06-20 10:08 3473次阅读

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

    理解函数指针函数指针数组、函数指针数组的指针
    的头像 发表于 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语言-内联函数、递归函数指针函数

    这篇文章介绍C语言的内联函数、递归函数函数指针指针函数、局部地址、const关键字、exte
    的头像 发表于 08-14 10:03 1654次阅读

    指针进阶第五站:函数指针

    定义一个函数指针,指向的函数有两个int形参并且返回一个函数指针,返回的指针指向一个有一个int
    发表于 08-17 15:58 517次阅读

    如何使用函数指针

    在程序中定义一个函数,则编译时系统就会为这段代码分配一段存储空间,这段存储空间的首地址称为函数的地址,且函数名代表的就是这个地址。既然是地址就可以使用一个指针变量来存储这个地址,这个
    的头像 发表于 03-30 15:09 831次阅读

    函数类型和函数指针类型的区别

    平时用的更多的是函数指针类型,比如作为函数参数传入回调函数等等。实际上函数类型也是可以作为函数
    发表于 10-24 14:27 348次阅读

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

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

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

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

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

    在嵌入式开发领域,函数指针指针函数、数组指针指针数组是一些非常重要但又容易混淆的概念。理解它
    的头像 发表于 08-10 08:11 676次阅读
    面试常考+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>数组