c :函数指针具体解释
在研究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 :函数指针具体解释的更多相关文章
- 成员函数指针与高效C++委托 (delegate)
下载实例源代码 - 18.5 Kb 下载开发包库文件 - 18.6 Kb 概要 很遗憾, C++ 标准中没能提供面向对象的函数指针. 面向对象的函数指针也被称为闭包(closures) 或委托(del ...
- qsort中的函数指针,及函数解释
函数指针有何用 函数指针的应用场景比较多,以库函数qsort排序函数为例,它的原型如下: void qsort(void *base,size_t nmemb,size_t size , int(*c ...
- 为什么 C++ 中成员函数指针是 16 字节?
当我们讨论指针时,通常假设它是一种可以用 void * 指针来表示的东西,在 x86_64 平台下是 8 个字节大小.例如,下面是来自 维基百科中关于 x86_64 的文章 的摘录: Pushes a ...
- C++函数指针总结
学习c++的过程中,指针是难点,熟悉了指针之后,还有一个让人很蛋疼的难点,那就是函数指针了.本博文详细介绍一下常见的各种坑爹的函数指针. 至于指针的详细学习,推荐这篇博文C++指针详解 与数据一样,函 ...
- 类成员函数指针 ->*语法剖析
在cocos2d-x中,经常会出现这样的调用,如 ->*,这个是什么意思呢,如下面得这个例子: , 其实这是对类的成员函数指针的调用,在cocos2dx中,这种形式多用于回调函数的调用.如我们经 ...
- C语言函数指针基础
本文写的非常详细,因为我想为初学者建立一个意识模型,来帮助他们理解函数指针的语法和基础.如果你不讨厌事无巨细,请尽情阅读吧. 函数指针虽然在语法上让人有些迷惑,但不失为一种有趣而强大的工具.本文将从C ...
- c语言指针函数与函数指针
例一:指针函数 指针函数是指带指针的函数,即本质是一个函数.函数返回类型是某一类型的指针 类型标识符 *函数名(参数表) int *f(x,y); 首先它是一个函数,只不过这个函数的返回值是一个 ...
- C++中怎么获取类的成员函数的函数指针?
用一个实际代码来说明. class A { public: staticvoid staticmember(){cout<<"static"<<endl;} ...
- 1、C语言中的函数指针
一 通常的函数调用 void MyFun(int x); //此处的申明也可写成:void MyFun( int ); int main(int argc, char* argv[]) { MyFun ...
随机推荐
- [Jobdu] 题目1499:项目安排
题目描述: 小明每天都在开源社区上做项目,假设每天他都有很多项目可以选,其中每个项目都有一个开始时间和截止时间,假设做完每个项目后,拿到报酬都是不同的.由于小明马上就要硕士毕业了,面临着买房.买车.给 ...
- env命令详解
env命令时gnu的coreutils包内的一个软件,它的功能是:在一个修改后的环境里执行命令. 通俗的讲:一个linux软件可能被安装在好几个地方,举个例子:在最新的centos中perl的版本为5 ...
- e到底是什么?
e到底是什么? 今天看到一个下面这么一个简单的求极限问题- 一时恍惚了,为什么结果是e^m. 这个e是什么呢? 然后就百度了下,发现不少文章介绍这个e. 有几篇写得很赞 - An Intuitive ...
- cocos2d-x开发记录:二,基本概念(骨骼动画)
九,骨骼动画 1.骨骼动画vs Sprite sheets 你能使用sprite sheets 创建动画,它很快又容易.直到你意识到你的游戏需要大量的动画并且内存消耗越来越高,并且需要时间载入全部数据 ...
- 清理parallels desktop 卸载后的图标残留
卸载parallels后, 之前windows上打开过的文件图标还是带两条竖线,CNM! 解决办法: 1.终端输入: /System/Library/Frameworks/CoreServices.f ...
- Android手机WiFi调试
一.判断手机是否能被电脑所识别: 二.输入adb tcpip 8888 设置连接的端口为8888(可以设置为任意数字,默认为5555, 后面连接的时候若不想输入端口可将端口设置为5555.)如下图所示 ...
- angular学习笔记(二)-创建angular模块
如果在页面的html标签(或任意标签)中添加ng-app,表示对整个页面应用angular来管理. 他是一个模块. 模块有助于把东西从全局命名空间中隔离. 今天学习如何自定义创建模块: <!DO ...
- 编写Spark的WordCount程序并提交到集群运行[含scala和java两个版本]
编写Spark的WordCount程序并提交到集群运行[含scala和java两个版本] 1. 开发环境 Jdk 1.7.0_72 Maven 3.2.1 Scala 2.10.6 Spark 1.6 ...
- maven-gpg-plugin:1.2:sign (sign-artifacts) on project jdbc-pool: Cannot obtain passphrase in batch mode或者是Plugin execution not covered by lifecycle configuration
本解决方案转自:http://blog.csdn.net/tangximing123/article/details/21179467 执行 Maven install 时报错: Failed to ...
- iOS 键盘处理(改变键盘为完成键),UITextField键盘显示隐藏,弹出,回弹
很多时候用到UITextField时,处理键盘是一个很棘手的问题. 问题一:如何隐藏键盘? 方案1.改变键盘右下角的换行(enter)键为完成键,后实现代理方法键盘自动回弹 keyBoardContr ...