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程序设计》(第三版)谭浩强
最新文章
- Caffe+CUDA7.5+CuDNNv3+OpenCV3.0+Ubuntu14.04 配置参考文献 以及 常见编译问题总结
- day13---堡垒机
- HDU 5686:2016";百度之星"; - 资格赛 Problem B
- iOS - Plist 数据解析
- 手把手教你反编译别人的app
- javascript默认中文(汉字/标点)长度均为1的解决
- (2)入门指南——(2)jQuery可以做什么(What jQuery does)
- ER模型
- SUID、SGID、Sticky BIT
- 《SpringMVC从入门到放肆》七、模型与视图ModelAndView
- .net 添加api不能访问的问题
- [转]JSOUP 抓取HTTPS/HTTP网页,校验问题
- 1177: LFX学橙啦!题解
- unicode解码
- 考前停课集训 Day4 雷
- python报错问题解决:&#39;ascii&#39; codec can&#39;t encode character
- Cassandra的commitLog、memtable、 SStable
- bzoj千题计划181:bzoj1878: [SDOI2009]HH的项链
- HCNP学习笔记之IP地址、子网掩码、网关的关系
- shell 算术运算符