我无法理解以下声明,有人可以帮助我。这有点令人困惑,我找不到任何适当的解释,加上我在练习之前从未见过这种类型的声明。
char(*(*x())[])();
char(*(*x[3])())[5];
void (*b(int, void (*f)(int)))(int);
void (*ptr)(int(*)[2], int(*)(void));
答案 0 :(得分:1)
你需要分解它们,最后两个更容易:
char (*(*x())[])();
char (*x)(); // A pointer to a function returning char with any args.
char (*x[])(); // An array of such pointers.
char (*(*x)[])(); // A pointer to such array.
char (*(*x())[])(); // A function returning such pointer: A function returning a pointer to
// an array of pointer to function returning char with any args.
char(*(*x[3])())[5];
char(*x)(); // A pointer to a function returning char with any args.
char(*x)()[5]; // A pointer to a function returning an array of 5 chars (any args).
char((*x)())[5]; // Same as above.
char(*(*x)())[5]; // A pointer to a function returning a pointer to an array of 5 chars.
char(*(*x[3])())[5]; // An array of 3 of these pointers.
void (*b(int, void (*f)(int)))(int);
X b(int, void(*f)(int)); // A function returning X and taking an int and a pointer to
// a function f taking an int and returning nothing.
void (*b())(int); // A function taking nothing and returning a pointer to a function
// taking and int and returning nothing.
void (*b(int, void (*f)(int)))(int); // Combination of the two above, a function taking and
// an int and a pointer to a function f and returning
// a pointer to a function.
void(*ptr)(int(*)[2], int(*)(void)); // This one is easier:
void(*ptr)(); // A pointer to a function with no args and returning nothing.
void(*ptr)(int(*)[2], int(*)(void)); // A pointer to a function returning nothing and taking:
// - A pointer to an array of 2 int
// - A pointer to a function returning int with no args.
您可以使用cdecl.org检查所有这些内容。
int (*f())[5]; // A function returning a pointer to an array of 5 int.
int (*f())(int); // A function returning a pointer to a function int (*)(int).
请注意,在这两个声明中,部分返回类型在函数的参数列表后出现,这就是为什么在第一次遇到它们时常常会让人感到困惑。
int b(void(*f)(int), int(*p)[2]);
int b(void(*)(int), int(*)[2]); // Same as above
x[N]
,然后它是«数组N的东西»:int (*x[3])(); // x is an array of 3 pointers to functions int(*)().
int (*x[4])[5]; // x is an array of 4 pointers to array of 5 int.
int (*x)[4]; // x is not an array.
答案 1 :(得分:0)
这看起来像是第二版Kernighan和Ritchie(C编程语言)中的一个邪恶的例子,p。 122(第5.12节:复杂声明),其中它被描述为一个函数,返回指向返回char的函数的指针数组的指针。这是一个用法示例:
#include <stdio.h>
char x1() { return 'a'; } // Function returning a char
char (*x2[])() = {&x1}; // Array of pointers to functions returning char
char (*(*x())[])() { return &x2; } // Function returning a pointer to the above
void main(){
char (*x3)() = **x(); // Pointer to a function returning char
printf("This is the value: %c\n", x3());
}