首先看一段代码:
#include <stdio.h>void test(){printf("hehe\n");}int main(){printf("%p\n", test);printf("%p\n", &test);return 0;}
输出的结果:
输出的是两个地址,这两个地址是 test 函数的地址。
那我们的函数的地址要想保存起来,怎么保存?
下面我们看代码:
void test(){printf("hehe\n");}//下面pfun1和pfun2哪个有能力存放test函数的地址?
void (*pfun1)();void *pfun2();
首先,能给存储地址,就要求pfun1或者pfun2是指针,那哪个是指针?
答案是:
pfun1可以存放。pfun1先和*结合,说明pfun1是指针,指针指向的是一个函数,指向的函数无参 数,返回值类型为void。
练习:
#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:
#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 。
#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;
}
阅读两段有趣的代码:
//代码1(*(void (*)())0)();//代码2void (*signal(int , void(*)(int)))(int);
代码2太复杂,如何简化:
typedef void(*pfun_t)(int);pfun_t signal(int, pfun_t);