以下是函数指针数组
(int) (*a[5]) (int);
int f1(int){};
...
以下定义方式是否正确?
a = f1;
a + 1 = f2;
a + 2 = f3;
...
我们如何称呼这些功能?
*a(1) // is this correct???
*(a+1) (2)
答案 0 :(得分: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));
}
答案 1 :(得分:2)
你所谓的“定义”只是赋值,当你这样做时,它是错误的,因为你不能分配给C中的数组。你只能分配给单个数组元素,正确的是{{1等等。
通常,对于函数指针数组,不需要在运行时动态分配它们。函数指针无论如何都是编译时间(或链接时间)常量。
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)
。
答案 2 :(得分:1)
你可以写:
a[0]=&f1;
并将其命名如下:
a[0](1);
请注意,在调用函数时不需要使用指针。 如果你坚持使用指针,那么无论如何你都可以做到:
(*a[0])(1);
答案 3 :(得分: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;
}
答案 4 :(得分: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;
}