您的位置:首页 > 编程语言 > C语言/C++

C语言函数指针与回调函数

2015-07-20 09:45 218 查看
代码区:

函数的名字就是函数的首地址.也就是函数的入口,也就是对应代码区的地址.

代码区存放的是:程序中函数经编译之后的cpu指令

函数: 是具有特定功能的代码段.

函数可以嵌套调用,但是不可以嵌套调用.

函数的指针就是所说的函数的首地址.

函数指针类型变量的声明定义格式: 函数 返回值数据类型 (*+函数指针变量的名字) (函数的形式参数1,函数的形式参数2,函数的形式参数3............);

例如下面这个计算两个 整形变量的值,返回一个整形结果的函数:

int add(int a,int b)

{

return a + b;

}

定义一个此函数类型的指针变量: int (*p) (int , int);

那么 函数指针p 就可以作为这个 具有两个形参是参数(全部都是整形的形式参数类型)并且返回值类型为整形的 函数的指针.

同样 对于这个函数

int min(int a,int b)

{

return a - b;

}

函数指针变量p也可以作为此函数的函数指针 因为此函数的 函数返回值为 int(整形)形 而且 函数的有两个形式参数,并且每个形参的类型都是 int

那么下面 这 几个函数:

int hh(int k); (1)

此函数就不能使用 函数指针p 因为 他的形参变量少了一个 他的函数指针类型为 int (*h) (int);

float kk(int i, int g); (2)

这个函数的函数指针类型为 : float (*k) (int , int);

void oo();(3)

这个函数的指针类型为 : void (*o)();

void ggg (int *p,float * d) (4)

此函数的函数指针类型为 : void (*g) (int *, float *);

int add3 (int a, int h, int op); (5)

此函数指针的函数指针类型为 : int (*a)(int , int , int);

double sum(double m, double l); (6)

此函数的函数值指针变量 : double (*s)(double , double);

以上是根据不同的函数的所定义的函数指针 :注意 上面函数指针 (* ) 里 *后面的变量名s, p,h,k,g,o,h都是自己临时起的,

只要符合标识符的命名规范就可以了. 而且在定义声明函数指针变量的时候函数的形式参数 的参数名字可以加上也可以不加,

但是函数的形参的数量不能少,而且一定要和原参数的类型对应.

那么当 函数指针变量定义后要记得 赋值 : 函数指针变量名 = 对应的函数名字;

例如;

p = min; a = add3; s = sum; g = ggg;

当函数指针有值以后就可以使用函数指针来调用函数:

例如:

先定义一些变量: int a = 4 , b = 5 , c = 7;

float k = 8, g = 14;

double d = 10 , v = 13;

常规的调用函数方式: 使用指针变量进行调用

add3(a , b , c ); a(a , b , c );

ggg(&a , &k); g(&a , &k);

sum(d , v); s(d , v);

min(a , b ); p(a , b);

可以看到上面的每一个函数指针的类型都非常的复杂,使用起来非常的不方便,那么使用typedef 关键字对函数指针类型进行重名,这样以后再一次需要声明此中类型那个的变量的时候就可以简写;

例如 这个函数 int ggg (int *p,float * d)

那么: typedef int (*p)(int * , float *); 此时就可以使用 p这个标识符来替代这个函数类型来定义函数的指针:

切记不要使用常规的typedef的格式区重命名函数指针类型

例如刚刚的: typedef int(*)(int *,float*); 这样是错的定义格式.

p (这里没有*号) point;

point = ggg;

那么point 就是指向这个函数的指针. 切记 重命名不要和原函数名字形同冲突.

例外一种形式:

typedef int(p)(int * , float *);(也可以比加*) 但是在定义的时候就要加*

例如: p * k (此时这里的* 号一定要加上)= ggg;//给指针赋值也就是 然函数指针k 指向函数ggg(将函数ggg的首地址赋值给指针变量p);

使用函数指针进行函数的调用的时候叫做会调函数.

函数指针作为函数的形参,这样程序的可扩充性就比较好.通过回调函数进行操作.

一旦函数指针作为函数的参数以后,这个函数就可以实现多种功能(作为多个函数的指针),只要指针类型符合参数类型就可以.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: