2013-12-16 60 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; 
}