void test()
{
printf("hehe\n");
}
//下面pfun1和pfun2哪个有能力存放test函数的地址?
void (*pfun1)();
void *pfun2();
首先,能给存储地址,就要求pfun1或者pfun2是指针,那哪个是指针?
答案是:
pfun1可以存放。pfun1先和*结合,说明pfun1是指针,指针指向的是一个函数,指向的函数无参
数,返回值类型为void。
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> void menu() { printf("--------------------\n"); printf("*** 模拟计算器 ***\n"); printf("--------------------\n"); printf("********************\n"); printf("***1.add 2.sub***\n");//1加 2减 printf("***3.mul 4.div***\n");//3乘 4除 printf("***5.pow 0.exit**\n");//5平方 0 printf("***6.cof 7.com***\n");//6最大公因数 7最小公倍数 printf("********************\n"); } 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 pow(int x, int y)//y 取值范围 y>=0; { if (y == 0) { return 1; } else { return x * pow(x, y - 1); } } int cof(int x, int y) { if (x < y) { int ret = x; x = y; y = ret; } while (x % y != 0) { int ret = x % y; x = y; y = ret; } return y; } int com(int x, int y) { int z = x * y;//两数乘积先保存,防止被改变。 int ret = cof(x, y);//调用一下最大公因数。 return z / ret;//最小公倍数为 原c乘积除以最大公因数。 } void calc(int(*cal)(int, int))//函数地址 用指针接收。 { int x = 0; int y = 0; int ret = 0; printf("请靓仔输入:"); scanf("%d %d", &x, &y); ret = (*cal)(x, y); printf("%d\n", ret); } int main() { int input = 0; do { menu(); printf("请靓仔选择:"); scanf("%d", &input); switch (input) { case 1: calc(add);//传自定义函数的地址。 break; case 2: calc(sub); break; case 3: calc(mul); break; case 4: calc(div); break; case 5: calc(pow); break; case 6: calc(cof); break; case 7: calc(com); break; case 0: printf("退出成功\n"); break; default: printf("无效输入,请靓仔重新开始:\n"); break; } } while (input); return 0; }
利用函数指针 这样case 里面代码就更加简洁
来分装一个小型函数。