Lvalue无效,指向函数的指针,是什么意思?调用函数要简单得多

时间:2012-09-12 07:15:41

标签: c pointers function-pointers lvalue

所以我正在练习函数的指针,并尝试制作这个简单的程序,这里是它的一个片段。在分配地址时,它仍然给出了“无效左值”的错误。 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);
}

2 个答案:

答案 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的声明,就会被错误而不是警告所咬。