迷途中的前进

在研究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程序设计》(第三版)谭浩强

理想的路总是为有信心的人预备着

迷途中的前进

相关文章:

你感兴趣的文章:

标签云: