所以我正在练习函数的指针,并尝试制作这个简单的程序,这里是它的一个片段。在分配地址时,它仍然给出了“无效左值”的错误。 funcptr =& addnum例如。我也不禁想知道这有什么用?调用函数不是更简单吗?或者我误解了什么
#include <stdio.h>
int arithnum(int base);
int addnum(int base,int new);
int subnum(int base,int new);
int mulnum(int base,int new);
int divnum(int base,int new);
typedef int *ptrdef(int,int);
int arithnum(int base)
{
char operator;
int operand;
ptrdef funcptr;
printf("Enter operator: ");
scanf("\n%c",&operator);
printf("Enter second operand: ");
scanf("%d",&operand);
switch(operator)
{
case '+':
funcptr = &addnum;
break;
case '-':
funcptr = &subnum;
break;
case '*':
funcptr = &mulnum;
break;
case '/':
funcptr = &divnum;
break;
}
return funcptr(base,operand);
}
答案 0 :(得分:1)
更改您的typdef。
变化:
typedef int *ptrdef(int,int);
到
typedef int (*ptrdef)(int,int);
回答你的另一个问题/陈述:“功能指针似乎无用”: 在您的示例中,它们的使用是微不足道的,但更有用的示例是C ++中的vtable。函数指针允许基类定义函数的签名,然后子类可以用自己的实现替换那些函数指针,改变对象响应函数的方式。
您也可以在COM模型API中使用它们,其中主应用程序与插件动态链接,并且插件返回所请求接口的函数指针结构。
答案 1 :(得分:1)
ITYM
typedef int (*ptrdef)(int,int);
因为您的版本是一个返回int *
的函数,而您需要一个返回int
的函数指针。
只是一个提示:我知道以下不是常识,但我更喜欢typedef
函数本身,然后再做
typedef int myfunc(int,int);
myfunc therealfunction; // bites me if I do a mistake
int therealfunction(int a, int b)
{
// do stuff and
return 42;
}
myfunc * funcptr = &therealfunction;
如果我不小心更改了therealfunction
的声明,就会被错误而不是警告所咬。