2012-09-12 29 views
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); 
} 
+2

[什么是函数指针用于...](http://stackoverflow.com/questions/1758564/what-are-function-pointers-used-for-and-how-would-i-use-them )。 – DCoder

+0

谢谢你!得到它了。 – latenightcode

回答

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的声明。

+0

谢谢你!我现在明白了,但是我的第二个问题呢?这有什么用?它更简单地称为功能.. – latenightcode

+0

通常使用的用法是决定一次做什么,以后再做。这样做,你可以e。 G。创建一个作业队列系统或一个数组中的函数表,将一个索引(本质上是一个int)映射到要执行的函数。 – glglgl

1

改变你的typdef。

变化:

typedef int *ptrdef(int,int); 

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

为了回答您的其他问题/声明:“函数指针似乎无用论”: 在你的榜样它们的使用是微不足道的,但一个更有用的例子是C++中的vtables。函数指针允许基类定义函数的签名,然后子类可以用它们自己的实现来替换这些函数指针,从而改变对象如何响应函数。

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

+0

同样的错误兄弟。无效的左值分配 – latenightcode

+0

我很确定你必须在网上说明如此。和K&R – latenightcode

+0

如果你有一个无效的左值,改变右边的东西是没有用的。在这种情况下,具有'funcptr'的东西是错误的。看到我的答案。 – glglgl