首先看一段代码:
cpp
#include <stdio.h>
void test()
{
printf("hehe\n");
}
int main()
{
printf("%p\n", test);
printf("%p\n", &test);
return 0;
}
输出的结果:
输出的是两个地址,这两个地址是 test 函数的地址。
那我们的函数的地址要想保存起来,怎么保存?
下面我们看代码:
cpp
void test()
{
printf("hehe\n");
}
//下面pfun1和pfun2哪个有能力存放test函数的地址?
void (*pfun1)();
void *pfun2();
首先,能给存储地址,就要求pfun1或者pfun2是指针,那哪个是指针?
答案是:
pfun1可以存放。pfun1先和*结合,说明pfun1是指针,指针指向的是一个函数,指向的函数无参 数,返回值类型为void。
练习:
cpp
#include <stdio.h>
int Add(int x, int y)
{
return x + y;
}
int main()
{
int (*pAdd)(int, int) = &Add;//pAdd存放Add函数的地址
int ret = (*pAdd)(1, 2);
printf("%d\n", ret);
return 0;
}
探究&Add与Add:
cpp
#include <stdio.h>
int Add(int x, int y)
{
return x + y;
}
int main()
{
printf("%p\n", &Add);
printf("%p\n", Add);
return 0;
}
经过查阅资料得知:&Add == Add。
与数组不同:int arr[]; &arr != arr 。
cpp
#include <stdio.h>
int Add(int x, int y)
{
return x + y;
}
int main()
{
int (*pAdd)(int, int) = Add;//也可以这样定义
int ret1 = (*pAdd)(2, 3);
printf("%d\n", ret1);
int ret2 = pAdd(2, 3);
printf("%d\n", ret2);
int ret3 = (*****pAdd)(2, 3);
printf("%d\n", ret3);
return 0;
}
阅读两段有趣的代码:
cpp
//代码1
(*(void (*)())0)();
//代码2
void (*signal(int , void(*)(int)))(int);
代码2太复杂,如何简化:
cpp
typedef void(*pfun_t)(int);
pfun_t signal(int, pfun_t);