这是一个问题:
使用右 - 左规则编写名为fubar的变量的 C 定义,该变量是指向函数的指针
获取指向char的指针并返回指向7个元素的数组的指针,其中每个元素都是指向a的指针
struct Sporcle。
我的回答:
*( (Sporcle*)[7] ) ( *fubar )( char* );
任何人都可以验证我的答案和/或给我一些指示(没有双关语意)吗?
编辑答案:
( (struct Sporcle*)[7] ) *( *fubar )( char* );
最终答案
struct Sporcle *(*(*fubar)(char *))[7];
答案 0 :(得分:14)
一次建立一块:
名为fubar
...
fubar
......这是一个指针......
*fubar
...到一个功能......
(*fubar)()
...带有指向char的指针......
(*fubar)(char *)
...并返回指针......
*(*fubar)(char *)
...到7个元素的数组......
(*(*fubar)(char *))[7]
...每个元素都是指针......
*(*(*fubar)(char *))[7]
...到struct Sporcle
。
struct Sporcle *(*(*fubar)(char *))[7]
你的答案是错误的 - 左边的东西(称为声明说明符)只能直接指定一个类型(类似int
的基类型,struct
, union
,enum
或使用typedef
定义的类型名称,可选择使用static
等存储类说明符和/或const
等类型说明符进行修改。通过修改声明的右侧(称为声明符),通过添加*
,[]
或{{1}来构造指针,数组和函数类型对它来说。
在这种情况下,声明说明符为()
,余数为声明符。
答案 1 :(得分:3)
cdecl(1)
是你的朋友:
cdecl> declare fubar as pointer to function(pointer to char) returning pointer to array 7 of pointer to struct Sporcle
struct Sporcle *(*(*fubar)(char *))[7]
答案 2 :(得分:3)
我不会评论有效性,但我会提供一个指针:不要这样做。除非这是纯粹的智力练习,否则重构声明使其不再是一个难题:
typedef Sporcle SevenSporcles[7];
SevenSporcles* (*fubar)(char*);