在研究opencv源码的过程中。处处可见到函数指针,于是翻出来谭浩强的《C程序设计》把函数指针这一块内容再补一补!

1 定义

数据类型 (*指针变量名)(參数表);

注:

数据类型是指的函数返回值的类型;

(*指针变量名)两側的括号不能省略。表示p先与*结合,是指针变量。然后再与后面的(參数表)结合;

(參数表)能够是一个參数,也能够是多个參数,只是在引用的时候要保证形參与实參一致。

2
int (*p)(int a, int b);

表示定义一个指向函数的指针变量p,它不是固定的指向哪一个函数。而是表示定义了这样一个类型的变量。它是专门用于存放函数的入口地址的。我们都知道每个函数都占用一段内存单元,它们有一个起始地址,我们就是使用函数指针来指向函数的入口地址的。

在一个程序中,同一个函数指针变量能够指向多个函数,可是要务必保证这些函数都是同类型的不同函数。

3  赋值

在给函数指针变量赋值时,仅仅须要给出函数名,而不必给出參数,比方:

p=max。

而不能写成:

p=max(x。y);

由于是将函数入口地址赋给p,而不涉及到实參和形參的结合问题。

4 注意

和数组名代表地址数组地址首地址类似。函数名代表该函数的入口地址。

p是指向函数的指针变量,它仅仅能指向函数的入口处。而不能指向函数的中间的某条指令,因此不能用*(p+1)来表示函数的下一条指令。

同理,p++,p--或者p+n都是不正确的。

5 实例

#include <stdio.h>
int max(int x, int y); /*函数声明 求最大值*/</span>
int min(int x, int y); /*函数声明 求最小值*/</span>
int add(int x, int y); /*函数声明 求和值*/</span>
void process(int i, int j, int (*p)(int a, int b)); /*函数声明 调用函数指针*/ int main()
{
int x, y;
cin>>x>>y; cout<<"Max is: ";
process(x, y, max); cout<<"Min is: ";
process(x, y, min); cout<<"Add is: ";
process(x, y, add); getch();
return 0;
} int max(int x, int y) /*函数定义 求最大值*/
{
return x > y ? x : y;
 }
int min(int x, int y) /*函数定义 求最小值*/
{
 return x > y ? y : x;
}
int add(int x, int y) /*函数定义 求和值*/
{
return x + y;
 }
void process(int i, int j, int (*p)(int a, int b))
<pre name="code" class="cpp"> /*函数定义 调用指针*/

{

 cout<<p(i, j)<<endl;

 }




当输入为:

1    2

输出结果为:

max is:2

min is:1

add is:3

6 补充

以下对上述样例再做一下补充,从本例中能够看出不论调用max,min,还是add,函数process一点都没有修改,仅仅是在调用process函数时改变了实參函数名而已。这就添加了函数使用的灵活性。能够编写一个通用的函数来实现各种专用的功能。须要注意的是,对作为实參的函数,应在主调函数前(中)先函数声明。

參考内容:

《c程序设计》(第三版)谭浩强

c :函数指针具体解释的更多相关文章

  1. 成员函数指针与高效C++委托 (delegate)

    下载实例源代码 - 18.5 Kb 下载开发包库文件 - 18.6 Kb 概要 很遗憾, C++ 标准中没能提供面向对象的函数指针. 面向对象的函数指针也被称为闭包(closures) 或委托(del ...

  2. qsort中的函数指针,及函数解释

    函数指针有何用 函数指针的应用场景比较多,以库函数qsort排序函数为例,它的原型如下: void qsort(void *base,size_t nmemb,size_t size , int(*c ...

  3. 为什么 C++ 中成员函数指针是 16 字节?

    当我们讨论指针时,通常假设它是一种可以用 void * 指针来表示的东西,在 x86_64 平台下是 8 个字节大小.例如,下面是来自 维基百科中关于 x86_64 的文章 的摘录: Pushes a ...

  4. C++函数指针总结

    学习c++的过程中,指针是难点,熟悉了指针之后,还有一个让人很蛋疼的难点,那就是函数指针了.本博文详细介绍一下常见的各种坑爹的函数指针. 至于指针的详细学习,推荐这篇博文C++指针详解 与数据一样,函 ...

  5. 类成员函数指针 ->*语法剖析

    在cocos2d-x中,经常会出现这样的调用,如 ->*,这个是什么意思呢,如下面得这个例子: , 其实这是对类的成员函数指针的调用,在cocos2dx中,这种形式多用于回调函数的调用.如我们经 ...

  6. C语言函数指针基础

    本文写的非常详细,因为我想为初学者建立一个意识模型,来帮助他们理解函数指针的语法和基础.如果你不讨厌事无巨细,请尽情阅读吧. 函数指针虽然在语法上让人有些迷惑,但不失为一种有趣而强大的工具.本文将从C ...

  7. c语言指针函数与函数指针

    例一:指针函数 指针函数是指带指针的函数,即本质是一个函数.函数返回类型是某一类型的指针 类型标识符    *函数名(参数表) int *f(x,y); 首先它是一个函数,只不过这个函数的返回值是一个 ...

  8. C++中怎么获取类的成员函数的函数指针?

    用一个实际代码来说明. class A { public: staticvoid staticmember(){cout<<"static"<<endl;} ...

  9. 1、C语言中的函数指针

    一 通常的函数调用 void MyFun(int x); //此处的申明也可写成:void MyFun( int ); int main(int argc, char* argv[]) { MyFun ...

随机推荐

  1. 关于TcpClient,Socket连接超时的几种处理方法

    用TcpClient做通信的时候,经常发现网络连接不通的时候,代码就卡死在那里,TcpClient竟然没有超时的设定 泪奔啊 看来微软不是把所有工具准备得妥妥当当的啊 没办法 现在用线程来包装一下这个 ...

  2. js获取日期实例之昨天今天和明天、后天

    本文介绍了js获取日期的方法,可以获取前天.昨天.今天.明天.后天. 代码: <html> <head> <meta http-equiv="Content-T ...

  3. 从零開始学android&lt;mediaplayer自带播放器(视频播放).四十九.&gt;

    MediaPlayer除了能够对音频播放之外,也能够对视频进行播放,可是假设要播放视频仅仅依靠MediaPlayer还是不够的.还须要编写一个能够用于视频显示的空间,而这块显示空间要求能够高速的进行G ...

  4. 代码二次封装-xUtils(android)

    通常我们会引用很多lib 而且会出现lib 与我们的功能仅仅差一点点 这种情况我们最好不要去改动源代码 而是进行二次封装 举例我使用 xUtils的二次封装 此处说明我是搞ios的 这个是androi ...

  5. Maven 在eclipse中如何配置

    大部分码农们都很熟悉Eclipse,用eclipse开发项目,Maven是解决依赖库的一个非常好用的java工具,可以与Eclipse集成,方便地管理web,java项目等等:但是很多初学者都不知道怎 ...

  6. Winform文件夹图片批量压缩整理修改

    效果图: 窗体设计器生成的代码: namespace ImageCompact { partial class MainForm { /// <summary> /// 必需的设计器变量. ...

  7. 委托事件和jquery中的delegate方法

    利用事件冒泡的特性,给父元素绑定事件,然后判断事件对象,来给父元素的每个子元素添加事件,而不是直接在所有的子元素上绑定事件: <ul> <li></li> < ...

  8. sudo和man的tab自动补全

    要加入sudo和man的tab自动补全功能,只需在~/.bashrc中加入: #Enabling tab-completioncomplete -cf sudocomplete -cf man

  9. Disable Maven Nature和disable workspace resolution

    1.Disable Maven Nature myeclipse更新maven的时候,手抖了一下,点上了Disable Maven Nature,然后工程右键菜单中的Maven栏就不见了! 其实这是把 ...

  10. 【工具】小巧好用的屏幕截图工具——ScrToPic

    百度搜ScrToPic,有绿色版的用. 好处: 小巧快捷,不用为了截图而开QQ,不用看QQ的弹窗广告. 可以自定义截图区域和窗口捕捉,可以自定义这两个功能的快捷键. 截图时可以选择要不要显示鼠标. 窗 ...