1

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

2 回答 2

1

更改您的类型定义。

改变:

typedef int *ptrdef(int,int);

typedef int (*ptrdef)(int,int);

要回答您的其他问题/陈述:“函数指针似乎没用”:在您的示例中,它们的使用是微不足道的,但更有用的示例是 C++ 中的 vtables。函数指针允许基类定义函数的签名,然后子类可以用自己的实现替换这些函数指针,从而改变对象对函数的响应方式。

您还可以在 COM 模型 API 中使用它们,其中主应用程序与插件动态链接,并且它们的插件返回所请求接口的函数指针结构。

于 2012-09-12T07:19:19.747 回答
1

ITEM

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.

于 2012-09-12T07:20:36.320 回答