C中的混合指针,数组和函数类型声明

nmu*_*ntz 8 c

我的一个朋友试图用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)

  • 这难以置信!我不知道这个实用程序.谢谢! (3认同)

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使包含函数指针的代码更清晰.


ten*_*x2j 7

  1. 一个函数指针
  2. 一组函数指针
  3. 指向函数指针的指针数组


Chr*_*utz 6

它们是函数指针,如上所述,但写得相当令人讨厌(在我看来).我写它们的方式是:

typedef int (*funcptr)(int, char *, void *);

funcptr x;
funcptr x[10];
funcptr *x;
Run Code Online (Sandbox Code Playgroud)

有关函数指针的更多信息,请参阅Walt W的优秀答案.