C++函数指针,回调函数??

前两天被问到p是指向函数的指针,p(a,b) 是什么鬼?

查了一下原来p(a,b)是(*p)(a,b)的简写方式,后者直观多了!

以下代码输出结果都是一样的.


#include <iostream>
using namespace  std;
int add(int,int);
int main(int argc,char* argv[])
{
    int a = 1;
    int b = 2;
    int(*p)(int,int);//定义一个指向一个具有两个整形参数的函数的指针,该函数返回值为int型
    p = add;//add的两个参数为int型,返回值为int型,符合函数指针p的性质,所以p可以指向add函数
    int x = (*p)(a,b);//要对指针进行使用,需要解引用吧,所以(*p)相当于add,所以(*p)(a,b)=add(a,b)
    cout<<"(*p)(a,b): "<<x<<endl;
    int y = p(a,b);//这是(*p)的简写方式,但是更直观的理解应该是(*p)(a,b)
    cout<<"p(a,b): "<<y<<endl;
    int z = add(a,b);
    cout<<"add(a,b): "<<z<<endl;
    return 0;
} 
int add(int a,int b){
    return a+b;
}

再者,int* (*p)(int*,int*)是指向返回值为int*类型,参数是int*类型的函数!

int* (*p)(int*,int*);
int* add(int*,int*);

 又者,回调函数经常会使用函数指针,那么怎么理解回调函数呢?比如在main外定义了一个函数,但是在main里面不会直接调用这个函数,而是将这个函数作为其他函数的参数,或者直接在其他函数里面运行!虽然没有直接在main中调用该函数,但是该函数还是会执行!

main.c

#include<stdio.h>

//先声明外部变量再使用
extern void (*step)(void);

void mystep_cb(void){
    printf("时间到了");
}

int main(){
    step = mystep_cb;
    run();
}

run.c

#include <unistd.h>

//希望子在run的循环里,每隔1s运行一个函数,这个函数由main.c来指定(函数在main.c文件里面)
void (*step)(void)=NULL;
//无限运行函数,每秒ct自增,算秒函数
void run(void){
    int ct=0;
    while(1){
        if(step!=NULL){
            step();
        }
        ct++;
        sleep(1);
    }
}

可以看到我们是不知道run()干了什么的,我们只能通过函数指针提供不同的函数给run使用,所以.这更像一个可以修改某输入的打包好的库!,该修改就是由函数指针实现或者由回调函数实现!

猜你喜欢

转载自blog.csdn.net/Li_haiyu/article/details/87930939