2013-12-16 82 views
4

繼數組是函數指針數組訪問函數指針

(int) (*a[5]) (int); 
int f1(int){}; 
... 

是定義下列方式正確嗎?

a = f1; 
a + 1 = f2; 
a + 2 = f3; 
... 

我們如何稱這些功能?

*a(1) // is this correct??? 
*(a+1) (2) 
+2

你的編譯器說了什麼?我懷疑它抱怨'左值'在哪裏它預期'左值'??? – Floris

+0

[http://stackoverflow.com/questions/252748/使用一個函數的數組指針) –

回答

2
#include <stdio.h> 

int f1(int i) { return i; } 
int f2(int i) { return i; } 

int main() { 
    int (*a[5]) (int); 
    a[0] = f1; 
    a[1] = f2; 
    printf("%d\n", a[0](2)); 
    printf("%d\n", a[1](5)); 
} 
+0

所以我的定義方式是錯的?對嗎? –

+0

是刪除第一個括號(int).. –

+0

問題標記爲C而不是C++ –

1

你可以寫:

a[0]=&f1; 

和下面稱之爲:

a[0](1); 

請注意,有沒有必要使用指針,而函數獲取調用。 如果你堅持使用指針,那麼你可以無論如何做如下:

(*a[0])(1); 
+0

f1本身是一個指針 –

0
#include<stdio.h> 
int (*a[5]) (int); 
int f1(int i){printf("%d\n",i); return 0;} 
int f2(int i){printf("%d\n",i); return 0;} 
int f3(int i){printf("%d\n",i); return 0;} 

int main(void) 
{ 
    a[0] = f1; // Assign the address of function 
    a[1] = f2; 
    a[2] = f3; 

    (*a[0])(5); // Calling the function 
    (*a[1])(6); 
    (*a[2])(7); 

    getchar(); 
    return 0; 
} 
2

你叫什麼?「定義」僅僅是分配,並且你正在做的,這是錯誤的,因爲你不能分配給C中的數組。你只能分配給單獨的數組元素,正確的將是a[0] = f1

通常,對於函數指針數組,無需在運行時動態分配它們。無論如何,函數指針都是編譯時間(或鏈接時間)常量。

/* in your .h file */ 
extern int (*const a[5]) (int); 

/* in your .c file */ 
int (*const a[5]) (int) = { f1, f2, f3 }; 

爲了使用函數指針位,對於f1標識符是相當於一個函數指針&f1以及使用與括號函數指針如在a[0](5)是一樣的解引用指針和調用所得的簡化功能(*(a[0]))(5)

+0

我仍然在努力去理解[*](5)如何等價於(*(a [0]))(5 ) –

+0

@ user2901020,對於任何函數指針「int(* fp)(int)','fp(5)'和'(* fp)(5)'都是等價的。這裏沒有什麼可以「理解」的,這只是C語言定義的一個簡短的縮寫。 –

+0

好的,謝謝 –

1

它始終是更好地使用typedef,(和您的所有函數都需要有一個共同的接口反正也是在聲明時,初始化其中可能的功能陣列,也應該是const作爲安全措施這樣:

#include <stdio.h> 

typedef int (*mytype)(); 
int f1(int i) { return i; } 
int f2(int i) { return i; } 

int main() { 
    const mytype a[5] = {f1,f1,f2,f2,f1}; 

    printf("%d\n", a[0](2)); 
    printf("%d\n", a[1](5)); 

    return 0; 
}