前两天被问到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使用,所以.这更像一个可以修改某输入的打包好的库!,该修改就是由函数指针实现或者由回调函数实现!