繼數組是函數指針數組訪問函數指針
(int) (*a[5]) (int);
int f1(int){};
...
是定義下列方式正確嗎?
a = f1;
a + 1 = f2;
a + 2 = f3;
...
我們如何稱這些功能?
*a(1) // is this correct???
*(a+1) (2)
繼數組是函數指針數組訪問函數指針
(int) (*a[5]) (int);
int f1(int){};
...
是定義下列方式正確嗎?
a = f1;
a + 1 = f2;
a + 2 = f3;
...
我們如何稱這些功能?
*a(1) // is this correct???
*(a+1) (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));
}
所以我的定義方式是錯的?對嗎? –
是刪除第一個括號(int).. –
問題標記爲C而不是C++ –
你可以寫:
a[0]=&f1;
和下面稱之爲:
a[0](1);
請注意,有沒有必要使用指針,而函數獲取調用。 如果你堅持使用指針,那麼你可以無論如何做如下:
(*a[0])(1);
f1本身是一個指針 –
#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;
}
你叫什麼?「定義」僅僅是分配,並且你正在做的,這是錯誤的,因爲你不能分配給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)
。
我仍然在努力去理解[*](5)如何等價於(*(a [0]))(5 ) –
@ user2901020,對於任何函數指針「int(* fp)(int)','fp(5)'和'(* fp)(5)'都是等價的。這裏沒有什麼可以「理解」的,這只是C語言定義的一個簡短的縮寫。 –
好的,謝謝 –
它始終是更好地使用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;
}
你的編譯器說了什麼?我懷疑它抱怨'左值'在哪裏它預期'左值'??? – Floris
[http://stackoverflow.com/questions/252748/使用一個函數的數組指針) –