我的一个朋友试图用C测试我(我最强的语言是C++),他问了我三个我无法回答的问题:
尝试解释以下声明:
1) int (*x)(int, char *, void *);
2) int (*x[10])(int, char *, void *);
3) int (**x[10])(int, char *, void *);
Run Code Online (Sandbox Code Playgroud)
任何人都可以解释这些函数声明并解释正在使用的概念吗?
hlo*_*dal 31
您需要该cdecl程序,它将为您提供明确,正确的答案.学习如何手动解释这些语句是可行和有益的,但即便如此,cdecl对于检查你是否有正确的答案非常有用.
prompt>cdecl
Type `help' or `?' for help
cdecl> explain int (*x)(int, char *, void *);
declare x as pointer to function (int, pointer to char, pointer to void) returning int
cdecl> explain int (*x[10])(int, char *, void *);
declare x as array 10 of pointer to function (int, pointer to char, pointer to void) returning int
cdecl> explain int (**x[10])(int, char *, void *);
declare x as array 10 of pointer to pointer to function (int, pointer to char, pointer to void) returning int
cdecl>
Run Code Online (Sandbox Code Playgroud)
Wal*_*t W 21
好吧,第一个是指向函数的指针.换句话说,它声明了一个变量"x",它指向以下类型的函数:
int function(int, char*, void*);
Run Code Online (Sandbox Code Playgroud)
可以使用如下:
int myfunc(int a, char* b, void* c) {
return a;
}
void acallingfunction() {
int (*x)(int, char*, void*);
x = myfunc;
x(1, "hello", 0);
}
Run Code Online (Sandbox Code Playgroud)
第二个似乎是无效的语法,但我可能是错的.如果它在x之前有一个星号(例如int(*x [10])(int,char*,void*)),它将是一个函数指针数组,并且将像普通数组一样使用:
x[3](1, "Hi there", 0);
Run Code Online (Sandbox Code Playgroud)
第三个是指向函数指针的指针数组,这看似不实用,但完全有效.示例用法可能是:
void anothercaller() {
int (*x)(int, char*, void*);
int (**y)(int, char*, void*);
x = myfunc;
y = &x;
(*y)(1, "hello", 0);
}
Run Code Online (Sandbox Code Playgroud)
请注意,其中前两个相对常见.指向函数的指针用于在C中完成回调和各种面向对象的编程概念.函数指针数组可用于事件表,以查找适当的回调.
请注意,所有这些都是有效的C++.;)
编辑:我显然犯了void main()的暴行.
编辑2:正如Chris Lutz在下面指出的那样,它们确实应该包含在typedef中.Typedef使包含函数指针的代码更清晰.
它们是函数指针,如上所述,但写得相当令人讨厌(在我看来).我写它们的方式是:
typedef int (*funcptr)(int, char *, void *);
funcptr x;
funcptr x[10];
funcptr *x;
Run Code Online (Sandbox Code Playgroud)
有关函数指针的更多信息,请参阅Walt W的优秀答案.