【C/C++学习】之七、指向函数的指针

什么是指向函数的指针

函数指针是指向函数的指针变量,不是指向对象的指针!函数指针本身应该是“指针变量”;

“在C语言中,函数本身不是变量,但可以定义指向函数的指针,这种指针可以被赋值、存放于数组之中,传递给函数及作为函数的返回值等” --《The C Programming Language Second Edition》

一个函数在编译的时候被分配一个入口地址,这个入口地址就称为函数指针。就一个函数来说,他做两件事,1、调用它。2、取得他的地址。 当你通过取得函数的地址来得到指针,那你就可以用这个指针来调用函数了!

下面来看一个实例:

 bool (*pf)(const string &, const string &) 

这里pf声明是一个指向函数的指针。参数是两个const string &类型和bool类型的返回值!

OK继续看:

 void a(int);void (*b)(int);b = a;//b = &a; //等效的   效果一样

当然要知道的是,指向函数的指针的声明你必须也要给出参数,跟函数声明是一样的,通过上面的实例会看出来的。 你调用函数的时候,参数也要完全匹配。 下面的应用中会给出实例;


下面我们来看一下用typedef来简化:

我们来简化一下函数指针;

typedef int (*ta)(int a);
在这里,ta 是一种指向函数的指针类型的名字。   你要使用这个函数指针的时候,你只需要直接使用tf 就可以了。

如:  tf af = 0;

         tf bf = a;

就像这样。


当然,指向函数的指针也可以用来作为参数:函数的参数可以是变量、指向变量的指针变量、数组名、指向数组的指针变量,也可以是指向函数的指针也可以作为参数,以实现函数地址的传递,这样就能够在被调用的函数中使用实参函数。

  void  sub ( int ( *x1) (int), int (*x2) (int,int) ){int a,b,i,j;a = (*x1)(i);      /* 调用 f1 函数 */b = (*x2)(i)(j);    /* 调用 f2 函数 */}

我们也可以通过指针来调用函数,在下面的如何使用函数指针那里我们会看到实例。


下面再来看一下  返回函数的指针。

int (*ff(int))(int *, int);

这个有点难理解了,我们要从里往外看:

ff(int)   这里将ff声明为一个函数,它有一个int的形参。  

这个函数的返回值就是int (*)(int *, int);

这是一个指向函数的指针。我们来变一下形式:

typedef int (*func)(int*, int); 
func ff(int)


最后看一下重载函数的指针:

void ff(string);
void ff(int);void (*pf1)(int) = &ff;

指针的类型必须与重载函数的一个版本精确匹配。如果没有匹配那么对这个指针的初始化或者赋值豆浆导致编译错误;


最后要注意的是,指向函数的指针没有++   --运算符;

指向函数的指针如何使用

#include<iostream>
using namespace std;int max(int a, int b)//来定义一个函数
{if (a > b){return a;}else{return b;}
}int main()
{typedef int (*tf)(int a, int b); //tf是别名int (*f)(int a, int b);//f是函数指针int a, b, c;f = &max;//赋值   &这个符号有没有都可以tf af = max;//初始化  赋值cin >> a >> b;c = (*f)(a, b);//调用cout << c << endl;c = af(a, b);//调用cout << c << endl;return 0;}


指针函数和函数指针

指针函数是指返回值是指针的函数,即本质是一个函数。而函数指针在上文我们已经介绍了那么多了!

实上,每一个函数,即使它不带有返回某种类型的指针,它本身都有一个入口地址,该地址相当于一个指针。


2012/8/20

jofranks于南昌


转载于:https://www.cnblogs.com/java20130723/archive/2012/08/20/3211409.html

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

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

相关文章

头像和Karma汽车

Powered by Zoundry RavenTechnorati : Karma, 头像, 汽车 Del.icio.us : Karma, 头像, 汽车 转载于:https://www.cnblogs.com/bsmagic/archive/2008/08/06/1261858.html

内核中架构相关代码简介

以下内容源于朱友鹏《物联网大讲堂》课程的学习&#xff0c;如有侵权&#xff0c;请告知删除。 1、内核代码基本分为3块 &#xff08;1&#xff09;arch&#xff1a;本目录下全是cpu架构有关的代码 &#xff08;2&#xff09;drivers&#xff1a;本目录下全是硬件的驱动 &am…

All-In-One Code Framework [一站式示例代码库] 【转】

All-In-One Code Framework [一站式示例代码库]2010 对一站式示例代码库&#xff0c;对奋战在一站式示例代码库上的每一位工程师来说都是不同寻常的一年。 在我们共同努力和开发社区的支持下&#xff0c;该项目从一年前的草根雏形&#xff0c;成长为CodePlex排名前三&#xff0…

Repeater的嵌套

今天做了一个小项目学习一下&#xff0c;是关于两个Repeater的嵌套使用的&#xff1a; 关于Repeater的嵌套&#xff0c;关键在于数据项的绑定。 首先&#xff0c;外Repeater需要设置OnItemDataBound事件&#xff0c;在事件中添加子Repeater的数据项绑定&#xff1b; <asp:Re…

Ioc容器Autofac介绍

Autofac是轻量级的开源Ioc容器&#xff0c;在这里可以下载http://code.google.com/p/autofac/。如果你用过其他的Ioc容器&#xff0c;那么学习Autofac使用也会比较容易&#xff0c;下面将通过一些例子来讲解其用法。 先看一个例子&#xff1a; 首先新建一个工程&#xff0c;添加…

汇编指令的学习2——常用的ARM指令

一、常用ARM指令1&#xff1a;数据处理指令 &#xff08;1&#xff09;数据传输指令 mov mvn&#xff08;源目标按位取反后赋给目标&#xff09; &#xff08;2&#xff09;算术指令 add sub rsb adc sbc rsc &#xff08;3&#xff09;逻辑指令 and orr eor …

cocos2dx 3.4 截图代码

Size size Director::sharedDirector()->getWinSize(); //定义一个屏幕大小的渲染纹理 RenderTexture* pScreen RenderTexture::create(size.width,size.height, kCCTexture2DPixelFormat_RGBA8888); log("-------log1---");//获得当前的场景指针 Scene* pC…

NSURLRequest详解IOS最基础的api

http://blog.csdn.net/bl1988530/article/details/6590099转载于:https://www.cnblogs.com/qiqibo/archive/2012/08/22/2650996.html

正则表达式 Mather类的使用

Matcher类: 使用Matcher类,最重要的一个概念必须清楚:组(Group),在正则表达式中 ()定义了一个组,由于一个正则表达式可以包含很多的组,所以下面先说说怎么划分组的, 以及这些组和组的下标怎么对应的. 下面我们看看一个小例子,来说明这个问题 \w(\d\d)(\w) 这个正则表达式有三…

ARM协处理器的汇编指令

以下内容源于网络资源的学习与整理&#xff0c;如有侵权请告知删除。 一、协处理器的简介 协处理器&#xff08;cp&#xff0c;coprocessor&#xff09;是SoC内部的处理单元&#xff0c;用来协助主CPU实现一些特定的功能&#xff0c;比如MMU、cache、TLB等内容。ARM在设计上支…

用代码实现Sharepoint2010的个人信息的照片上传(2)(原创)

用代码从AD读取照片信息并同步到SharePoint2010的个人照片信息中 前言 上篇我们讲到用代码实现了照片信息同步到SharePoint2010的个人照片信息中&#xff0c;但是做的是从文件夹读取照片信息到SharePoint2010,今天我们要做的从AD的thumbnailPhoto属性中读取照片信息到SharePoin…

HTML5实现Word中文字全环绕图片效果

实现这个功能是当时看见数字报的展示出来的编排方式&#xff0c;就是图片热点&#xff0c;而且下载打开还是PDF的&#xff0c;让我这个WP用户咋个看。想实现Word中的编排方式&#xff0c;也需要浏览器支持Word插件&#xff0c;火狐、谷歌、Opera这些都要另外弄插件&#xff0c;…

汇编指令的学习4——ldm/stm指令、栈的处理

1、为什么需要多寄存器访问指令&#xff1f; ldr/str每周期只能访问4字节内存&#xff0c;如果需要批量读取、写入内存时太慢&#xff0c;解决方案是stm/ldm ldm (load register mutiple) stm&#xff08;store register mutiple&#xff09; 2、举例&#xff1a;stmia sp,…

第一课 GCC入门

1序言 gcc是一个可移植的编译器&#xff0c;支持多种硬件平台&#xff1b;也不仅仅是一个本地编译器也是一个跨平台编译器&#xff1b;支持多张语言编译时按照模块化设计支持多种语言。 gcc编译过程&#xff1a;预处理&#xff08;预处理器&#xff09;&#xff1b;编译&#x…

[转载] 晓说——第9期:多如牛毛严酷无比的美国那些法

转载于:https://www.cnblogs.com/6DAN_HUST/archive/2012/08/26/2657224.html

ARM的汇编伪指令【伪指令的解释】

本文作为此博文的伪指令章节的补充说明。 伪指令的含义 伪指令本质上不是指令。伪指令由编译器环境提供&#xff0c;用来指导编译过程&#xff0c;经过编译后伪指令不会生成机器码。 伪指令是和具体的编译器相关的。我们使用GNU工具链&#xff0c;因此学习GNU环境下的汇编伪指令…

关注 Imagine Cup 2010, 参与软件设计“最具人气奖”投票

关注 Imagine Cup 2010, 参与软件设计“最具人气奖”投票 Imagine Cup 2010全球总决赛将于7月3日到7月8日在波兰华沙举行。现在通过参与软件设计“最具人气”奖投票&#xff0c;你也可以参与到Imagine Cup 2010中。了解全球学生是如何用科技创新帮助我们解决人类面临的最困难问…

浏览器模拟用户登陆

javascript:document.getElementById(user).valuejack;document.getElementById(password).valuetest;submitForm();void(0);转载于:https://www.cnblogs.com/ahghy/p/3488839.html

Bzoj 2127 happiness 最小割

happiness 题解: 将图转换成最小割. 将割完的图中与S相连的点看做选文科, 与T相连的点看做选理科. flow(s, u) 文科值 flow(u,t) 理科值 假设u 和 v 一起选文科有奖励值z, flow(s,u) z/2 flow(s,v) z/2, flow(u,v) z/2 假设u 和 v 一起选理科有奖励值z, flow(u,t) z/2…

C中静态存储区和动态存储区

c语言中需要内存来存放数据。而内存主要分为两类&#xff1a;静态存储区和动态存储区。 1、静态存储区 &#xff08;1&#xff09;分为数据区&#xff08;只读数据区&#xff08;代码区&#xff1f;在linux中又叫文本段.text&#xff09;、读写数据区.data&#xff09;、未初始…