继数组是函数指针数组访问函数指针
(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/使用一个函数的数组指针) –