1. 函数的地址
我们知道变量是有地址的,数组是有地址的,那么函数是否也有地址呢?
其实函数也是有地址的,我们做个测试:
#include <stdio.h>
void test()
{
printf("hehe\n");
}
int main()
{
printf("test: %p\n", test);
printf("&test: %p\n", &test);
return 0;
}
输出结果如下:
test: 00671424
&test 00671424
确实打印出来了地址,所以函数是有地址的,函数名就是函数的地址,当然也可以通过&函数名
的方式获得函数的地址。
2. 函数指针变量
什么是函数指针变量呢?
根据前面的整型指针,数组指针,我们类比关系,不难得出结论:
函数指针变量应该是用来存放函数地址的,未来通过地址能够调用函数的。
如果我们要将函数的地址存放起来,就得创建函数指针变量,函数指针变量的写法其实和数组指针非常类似,如下:
void test()
{
printf("hehe\n");
}
int main()
{
void(*pf1)() = &test;
void(*pf2)() = test;
return 0;
}
int Add(int x, int y)
{
return x + y;
}
int main()
{
int (*p1)(int, int) = Add;
int (*p2)(int x, int y) = &Add;//x和y写上或者省略都是可以的
return 0;
}
函数指针类型解析:
int (*pf3)(int x, int y)
| | |
| | |
| | pf3指向函数的参数类型和个数的交代
| 函数指针变量名
pf3指向函数的返回类型
int (*)(int x, int y) //pf3函数指针变量的类型
3. 函数指针变量的使用
通过函数指针调用指针指向的函数
#include <stdio.h>
int Add(int x, int y)
{
return x + y;
}
int main()
{
int(*pf3)(int, int) = Add;
printf("%d\n", (*pf3)(2, 3));
printf("%d\n", pf3(3, 5));
return 0;
}
输出结果
5
8
4. 两段有趣的代码
代码1
(*(void (*)())0)();
代码2
void(*signal(int, void(*)(int)))(int);
两段代码均出自:《C陷阱和缺陷》这本书
完