函数指针啊 函数和数组名类似都代表地址int add(int x, int y) { return x y; } int main() { printf(%p\n,add); printf(%p,add); }代码运行结果一样用函数指针接收函数地址的标准格式://存函数的地址 int (*pf)(int, int) add; printf(%p\n,add); printf(%p\n,pf);int add(int x, int y) { return x y; } int sub(int x, int y) { return x - y; } int cal(int (*pf)(int,int)) { int a 9; int b 19; return pf(a,b); } int main() { //取函数的地址 printf(%p\n, add); //存函数的地址 int (*pf)(int, int) add; //通过指针和解引用来使用函数 int s (*pf)(2, 3);//相比下面的更好理解 printf(%d\n,s); //简略写法 spf(2, 3);//没有什么理解难度平时调用函数就是这样 printf(%d\n, s); //将函数地址传给另一个函数 int acal(add); int bcal(sub); printf(%d\n, a); printf(%d\n, b); printf(%p\n,add); printf(%p\n,pf); }看两段复杂代码//函数指针强制类型转化注意要点 //错误的方法typedef void(*)(int) pf_t; typedef void(*pf_t)(int); //来看第一段傻逼代码 //0强制类型转化 //(void (*)())0 //调用0队应地址的函数(这个函数没有参数) //参考书籍c陷阱和缺陷 (*((void (*)())0))(); //来看第二段傻逼代码 //这是一个函数的声明 //signal函数的返回值是一个函数指针 //void (*signal(int, void(*)(int)))(int); // 简化写法pf_t signal(int, pf_t));通过函数指针实现计算器不用指针的写法int add(int x, int y) { return x y; } int sub(int x, int y) { return x - y; } int mul(int x, int y) { return x * y; } int div(int x, int y) { return x/y; } int cal(int (*pf)(int,int)) { int a 9; int b 19; return pf(a,b); } void menu() { printf(输入0实现退出\n); printf(输入1实现加法\n); printf(输入2实现减法\n); printf(输入3实现乘法\n); printf(输入4实现除法\n); } //通过函数指针实现计算器 int main() { int input 0; int a 0; int b 0; int ret 0; do { menu(); printf(请输入你的选择\n); scanf_s(%d,input); switch (input) { case 0: printf(退出计算器); break; case 1: printf(请输入两个需要操作的数据\n); scanf_s(%d %d, a, b); ret add(a, b); printf(%d\n, ret); break; case 2: printf(请输入两个需要操作的数据\n); scanf_s(%d %d, a, b); ret sub(a, b); printf(%d\n, ret); break; case 3: printf(请输入两个需要操作的数据\n); scanf_s(%d %d, a, b); ret mul(a, b); printf(%d\n, ret); break; case 4: printf(请输入两个需要操作的数据\n); scanf_s(%d %d, a, b); ret div(a, b); printf(%d\n, ret); break; default: printf(选择错误); break; } } while (input); }用函数指针int add(int x, int y) { return x y; } int sub(int x, int y) { return x - y; } int mul(int x, int y) { return x * y; } int div(int x, int y) { return x/y; } void cal(int (*pf)(int,int)) { printf(请输入两个需要操作的数据\n); int x 0; int y 0; scanf_s(%d %d, x, y); int retpf(x,y); printf(%d\n,ret); } void menu() { printf(输入0实现退出\n); printf(输入1实现加法\n); printf(输入2实现减法\n); printf(输入3实现乘法\n); printf(输入4实现除法\n); } //通过函数指针实现计算器 int main() { int input 0; int a 0; int b 0; int ret 0; do { menu(); printf(请输入你的选择\n); scanf_s(%d,input); switch (input) { case 0: printf(退出计算器); break; case 1: cal(add); break; case 2: cal(sub); break; case 3: cal(mul); break; case 4: cal(div); break; default: printf(选择错误); break; } } while (input); }函数指针数组int add(int x, int y) { return x y; } int sub(int x, int y) { return x - y; } int mul(int x, int y) { return x * y; } int div(int x, int y) { return x/y; } void cal(int (*pf)(int,int)) { printf(请输入两个需要操作的数据\n); int x 0; int y 0; scanf_s(%d %d, x, y); int retpf(x,y); printf(%d\n,ret); } void menu() { printf(输入0实现退出\n); printf(输入1实现加法\n); printf(输入2实现减法\n); printf(输入3实现乘法\n); printf(输入4实现除法\n); } //通过函数指针实现计算器 int main() { //函数指针数组 int (*arr[5])(int, int) {0,add,sub,mul,div}; int input 0; int a 0; int b 0; int ret 0; do { menu(); printf(请输入你的选择\n); scanf_s(%d,input); if (input 0) { printf(游戏退出\n); } else if (input0input5) { printf(请输入两个需要操作的数据\n); int x 0; int y 0; scanf_s(%d %d, x, y); ret arr[input](x, y); printf(计算结果等于%d\n,ret); } else { printf(请重新输入\n); } } while (input); }