|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
#include <stdio.h>
int add(int, int);
int sub(int, int);
int calc(int (*fp)(int, int), int, int);
int (*select(char op))(int, int);
int add(int num1, int num2)
{
return num1 + num2;
}
int sub(int num1, int num2)
{
return num1 - num2;
}
int calc(int (*fp)(int, int), int num1, int num2)
{
return (*fp)(num1, num2);
}
int (*select(char op))(int, int)
{
switch(op)
{
case '+': return add;
case '-': return sub;
}
}
int main()
{
int num1, num2;
char op;
int (*fp)(int, int);
printf("请输入一个式子(如:1+2):");
scanf("%d%c%d", &num1, &op, &num2);
fp = select(op);// 想问一下,不是说函数名字就是地址吗?前面小甲鱼讲函数指针的时候就是直接将函数名字赋给指针变量的(对应课程p30 13:48处,fp=square),按照前面讲的规则,不是应该fp=select吗?为什么这里要带上(op)呀(我试过去掉(op),程序无法正常运行,但是想问一下大家这是为啥?)
printf("%d %c %d = %d\n", num1, op, num2, calc(fp, num1, num2));
return 0;
}
#include <stdio.h>
int add(int, int);
int sub(int, int);
int calc(int (*fp)(int, int), int, int);
int (*select(char op))(int, int);
int add(int num1, int num2)
{
return num1 + num2;
}
int sub(int num1, int num2)
{
return num1 - num2;
}
int calc(int (*fp)(int, int), int num1, int num2)
{
return (*fp)(num1, num2);
}
int (*select(char op))(int, int)
{
switch(op)
{
case '+': return add;
case '-': return sub;
}
}
int main()
{
int num1, num2;
char op;
int (*fp)(int, int); // 这个是要select函数的返回值
int (*(*fps)(char op))(int num1, int num2); // 这个才是要select函数的地址
printf("请输入一个式子(如:1+2):");
scanf("%d%c%d", &num1, &op, &num2);
fp = select(op);
printf("%d %c %d = %d\n", num1, op, num2, calc(fp, num1, num2));
// 这可能是你想要的那种情况
fps = select; // 先把select函数的地址给fps变量
fp = fps(op); // 用fps这个变量来调用select函数,参数是上面输入的op变量,调用fps函数得到的返回值给fp变量
printf("%d %c %d = %d\n", num1, op, num2, calc(fp, num1, num2));
// select函数的返回值要么是add函数的地址,要么是sub函数的地址
// 像下面这样
// 不过这是直接在代码里面写死了
// 如果调用select函数的话,select函数会根据传入的op参数来决定是把add函数的地址给fp,还是把sub函数的地址给fp
fp = add;
printf("%d %c %d = %d\n", num1, op, num2, calc(fp, num1, num2));
fp = sub;
printf("%d %c %d = %d\n", num1, op, num2, calc(fp, num1, num2));
return 0;
}
|
|