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

来源:互联网 发布:csv数据怎么转换成mat 编辑:程序博客网 时间:2024/06/05 14:10
代码区:

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

代码区存放的是:程序中函数经编译之后的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);

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

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

一旦函数指针作为函数的参数以后,这个函数就可以实现多种功能(作为多个函数的指针),只要指针类型符合参数类型就可以.



1 0
原创粉丝点击