函数指针:
公式为:返回值类型 (*函数名字)(参数列表)
在某些场景中,我们必须要求程序从某一地址处开始执行,比如单片机中某些功能的地址是一成不变的,如果要使用该功能,则要从该地址执行。
假设某一地址为0x13,我们要调用该地址,则使用:
(*(void(*)())0x13)();
解析:
为了方便理解,我们改为(*(void (*name)())0x13);
- (void (*name)())从函数名name开始看起,name先与*结合,成为一个指针
该指针再与int ()结合,成为一个函数指针,此时(void (*name)())为一函数指针。
2.(void (*name)())0x13 : (void (*name)())将后面的地址0x13强制类型转换为函数指针,此时该函数指针的类型为void(*)
3.*( void (*name)())0x13 : 对函数指针进行解应用操作,将函数指针类型转为void()
4.(*(void (*)())0x13)() :调用该地址处的函数
对于第三步的解引用操作,个人理解为将该地址的函数指针类型与直接使用函数的指针类型相匹配,为void(),第三步可有可无,((void(*)())0x13)();效果是一样的
如果某一地址为0x13,函数返回类型为int 函数的参数也为int
调用时,可用:
(*(int(*)())0x13)(int num);