理解函数指针

  在学习函数指针, 我遇到了问题,  我定义一个指针指向负责打印参数的函数,  

 1 void (*p)( int ) = Fun; 

好奇该指针存放的是什么( 原以为是函数的入口地址),便调试观察一下他们的内存,   Fun的值是 函数入口地址 0x00401030 Fun(int),   而p的值是函数指针存放的内容 0x00401005 _Fun。   竟然不一样。 

     难道说0x00401005是函数名Fun所存放的内存地址? 

   看来我们在弄懂函数指针前, 需要知道函数名是个什么鬼? )

     首先它是个标识符, 其次它是一个常量指针, 因为当我试图把 3 赋值给Fun, 编译器告诉我warning C4047: '=' : 'void (__cdecl *)(int )' differs in levels of indirection from 'const int '。  这是一个函数指针。    我查看下资料, 函数名被使用时总是由编译器把它转换为函数指针。 在这里, 函数名标识了一个函数指针常量。

     接下来,我们探讨函数指针是什么鬼? 

     按理论讲,函数指针指向函数的入口地址。 查看汇编代码, 我在调用Fun处设置个断点, 然后进入这个函数,我发现没有直接进入,如图

 @ILT+0(_Fun): 00401005 E9 26 00 00 00 jmp Fun (00401030) 

它是跳转到我的Fun函数。  所以,函数指针指向的是跳转命令所在地址。 这不就和书本上的矛盾了。  我又尝试了一下strcmp函数, 这是一个库函数,是否也是这样呢?  于是,我写了一个字符串比较, 

    

 1 #include <string.h>
 2 #include <stdio.h>
 3 
 4 void
 5 main ()
 6 {
 7     int (*p)( const char *, const char * ) = strcmp;
 8     char *str1 = "afdf";
 9     char *str2 = "afdf";
10     
11     if ( !p( str1, str2 ) ){
12         printf( "same\n" );
13     }
14 }

调试时进入汇编界面, 在If判断语句处设置断点,进入p。我 发现直接进入strcmp函数内,

--- intel\strcmp.asm  ----------------------------------------------------------
strcmp:
0040D830 8B 54 24 04          mov         edx,dword ptr [esp+4]
0040D834 8B 4C 24 08          mov         ecx,dword ptr [esp+8]

奇怪,这跟刚才执行跳转命令不一样。为什么?  这是我自己的想法。  因为库函数已经指定了函数所在的路径, 而用户函数没有,所以需要临时跳转到用户函数的入口地址。

最后,归纳一下,  如果是库函数, 函数指针指向函数入口处; 如果是用户函数, 函数指针指向跳转到用户函数的指令所在地址。     把跳转指令看作用户函数的一部分,其实就和书本上的不矛盾。   所以,  结论是  函数指针指定了函数所在内存的位置。

 

          

  

 

转载于:https://www.cnblogs.com/the-one/p/4671274.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/574436.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

单元测试概念记录

单元测试 孤立的运行和测试某一个单元&#xff08;注重于每一个可能出错的细节&#xff09;。 优秀的单元测试的特性 1.自动的&#xff0c;可重复的 2.容易实现的 3.一旦写好将来都可以使用 4.任何人都可以运行 5.单击一个按钮就可以运行 6.可以快速的运行 判断是否是单元测试 …

zemax设置 像方远心_ZEMAX相机标定非常不完全指南

ZEMAX是广为使用的一款光学仿真软件&#xff0c;是进行光路设计和分析的利器&#xff1b;而相机标定&#xff0c;则是进行机器视觉任务时&#xff0c;拿到一款相机&#xff0c;对其实际参数进行确定的过程。因此看起来&#xff0c;二者其实主要是针对不同的侧重点。前者主要面向…

[转载]大型网站架构演变和知识体系

之前也有一些介绍大型网站架构演变的文章&#xff0c;例如LiveJournal的、ebay的&#xff0c;都是非常值得参考的&#xff0c;不过感觉他们讲的更多的是每次演变的结果&#xff0c;而没有很详细的讲为什么需要做这样的演变&#xff0c;再加上近来感觉有不少同学都很难明白为什么…

activiti 生命周期_一文让你读懂什么是Activiti工作流

Activiti工作流学习经验总结(一)什么是工作流&#xff1f;工作流指通过计算机对业务流程进行自动化管理&#xff0c;实现多个参与者按照预定义的流程去自动执行业务流程。什么是Activiti&#xff1f;Activiti 是一个开源架构的工作流引擎&#xff0c;基于bpmn2.0 标准进行流程定…

关于hkcmd.exe造成的和Eclipse之间热键冲突

可能是自己新买的笔记本比较强大,显卡也比较牛叉.当使用一些常用的Eclipse快捷键的时候Eclipse本身没有反应,反而显示器有了反应. 经常用的Eclispse中的快捷键CtrlAlt↑ 和CtrlAlt↓ 造成显示器内容的上翻转和下翻转 解决方式: 下载Windows Hot Key Explore 软件 在安装启动后…

中对曲线进行斜率提取_Au中的EQ处理方法——图形均衡器和参数均衡器

之前的文章详细讲过使用Cubase进行EQ处理&#xff0c;其实如果只是要对录音进行混音修音的话&#xff0c;使用Au也可以&#xff0c;Adobe Audition作为音乐录制及后期软件&#xff0c;具有很强大的后期功能&#xff0c;而且也可以添加插件&#xff0c;是修音混音非常好的工具。…

YUV格式转换RGB(基于opencv)

在编写代码将需要处理YUV格从每个视频帧中提取&#xff0c;然后将其保存为图片。有两种常见的方法在线&#xff0c;第一种是通过opencv自带cvCvtColor&#xff0c;可是这样的方法有bug。得到的图片会泛白。另外一种方法是公式法。 法一&#xff1a;opencv自带cvCvtColor 说明&a…

2 数据源配置_Spring, MyBatis 多数据源的配置和管理

作者&#xff1a;digdeep出处&#xff1a;https://www.cnblogs.com/digdeep/p/4512368.html热门推荐vuewebsocketSpringboot实现的即时通信开源项目springboot炸翔版CMS开源系统同一个项目有时会涉及到多个数据库&#xff0c;也就是多数据源。多数据源又可以分为两种情况&#…

(九十)使用多个storyboard+代码实现控制器的分开管理

使用单个storyboard会使得项目难与管理&#xff0c;使用纯代码又会过于麻烦&#xff0c;因此如果能将二者结合起来&#xff0c;并且使用多个storyboard&#xff0c;会使得项目简单简单、方便许多。 下面以一个简单的视图关系为例&#xff0c;介绍多个storyboard的用法。 ①有pa…

吗 支持windows_M1能否原生支持Windows 苹果把问题抛给了微软

关于苹果M1处理器近期已经有了非常多的报道&#xff0c;人们对其出色的性能表现以及较低的功耗还是充满了期待。那么最后一个也是最重要的一个问题&#xff0c;基于苹果M1处理器的电脑能原生支持微软Windows吗&#xff1f;毕竟很多人买回苹果MacBook第一件事就是安装Windows 10…

数据库设计五要点 让数据库设计更加规范

通常情况下&#xff0c;可以从两个方面来判断数据库是否设计的比较规范。一是看看是否拥有大量的窄表&#xff0c;二是宽表的数量是否足够的少。若符合这两个条件&#xff0c;则可以说明这个数据库的规范化水平还是比较高的。当然这是两个泛泛而谈的指标。为了达到数据库设计规…

4怎么放大字体_win8.1系统如何放大所有字体?

电脑安装上[color#070c0 !important]win8.1正式版系统&#xff0c;发现桌面的字体和网页的字体比较小&#xff0c;看起来比较吃力&#xff0c;从而影响操作。一般win8.1系统字体都默认设置好的&#xff0c;不过用户可以进行放大&#xff0c;那么win8.1系统怎么放大所有字体&…

进程 zabbix_Zabbix监控在windows的进程(非进程数)

场景介绍&#xff1a;小Z同学最近遇到个项目需求&#xff0c;需求是用zabbix监控运行在windows的进程。然鹅&#xff0c;当小Z同学在网上搜了一大堆&#xff0c;发现基本上都是使用官方的proc.num(***.exe)键值拿到进程数量&#xff0c;很显然&#xff0c;这并不符合客户实际的…

spring配置数据库

一.加载数据库驱动 1.利用hibernate.properties文件加载 <bean class"org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">   <property name"locations">     <list>       <value>classpath…

golang 切片 接口_如何理解Golang中的接口?

个人认为&#xff0c;要理解 Go 的接口&#xff0c;一定先了解下鸭子模型。鸭子模型那什么鸭子模型&#xff1f;鸭子模型的解释&#xff0c;通常会用了一个非常有趣的例子&#xff0c;一个东西究竟是不是鸭子&#xff0c;取决于它的能力。游泳起来像鸭子、叫起来也像鸭子&#…

batchnomal_pytorch的batch normalize使用详解

torch.nn.BatchNorm1d()1、BatchNorm1d(num_features, eps 1e-05, momentum0.1, affineTrue)对于2d或3d输入进行BN。在训练时&#xff0c;该层计算每次输入的均值和方差&#xff0c;并进行平行移动。移动平均默认的动量为0.1。在验证时&#xff0c;训练求得的均值/方差将用于标…

phpcms文件所需权限

转载于:https://www.cnblogs.com/zhongheng/p/4684087.html

mysql 设置大小写_mysql修改大小写参数注意事项

原由&#xff1a;数据库中原本参数lower_case_table_names的值为0&#xff0c;应开发要求需要修改为不区分大小写&#xff0c;即修改为1。但是修改完之后&#xff0c;发现本来建立的大写字母的表查不到。修改过程1&#xff0c;在参数文件中修改lower_case_table_names12&#x…

论文中如何写mysql的介绍_mysql优化写论文,从哪几方面入手啊解决方法

引用第7章&#xff1a;优化目录7.1. 优化概述7.1.1. MySQL设计局限与折衷7.1.2. 为可移植性设计应用程序7.1.3. 我们已将MySQL用在何处&#xff1f;7.1.4. MySQL基准套件7.1.5. 使用自己的基准7.2. 优化SELECT语句和其它查询7.2.1. EXPLAIN语法(获取SELECT相关信息)7.2.2. 估计…

如何理解java回电话

同android中间Button的setOnClickListener这个回调案例&#xff1b; Button button (Button)this.findViewById(R.id.button); button.setOnClickListener(new Button.OnClickListener() {//回调函数overridepublicvoid onClick(View v) {buttonTextView.setText("按钮被…