函数指针
首先看一段代码:
#include <stdio.h>
void test()
{
printf("hehe\n");
}
int main()
{
printf("%p\n", test);
printf("%p\n", &test);
return 0;
}
输出的是两个地址,这两个地址都是 test 函数的地址。 所以函数名前面加不加&都是可以获得该函数地址的。
那我们的函数的地址要想保存起来,怎么保存? 说白了就是函数指针变量怎么书写?
答案:void (*p)();前面是返回类型,后面是参数类型。
p先和*结合,说明p是指针,指针指向的是一个函数,指向的函数无参数,返回值类型为void。
如果没括号:void *p (),则代表这是一个函数叫作p,参数为空,返回类型是void*。
例子:
返回类型+(*)+(类型名)是函数指针类型
对函数取地址时候,不用&,函数没有首元素这个说法,它是一个整体,即ADD就是pf。
阅读两段有趣的代码:
//代码1
(*(void (*)())0)();
将0作为这个函数的地址,然后调用,数字也可以作为地址!
//代码2
void (*signal(int , void(*)(int)))(int)
函数的返回类型,除了数据类型和void还有 函数指针类型!