2012-09-12 62 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