定义变量时复杂的“从右到左”规则

时间:2011-12-05 21:37:30

标签: c variables pointers right-to-left

这是一个问题:
使用右 - 左规则编写名为fubar的变量的 C 定义,该变量是指向函数的指针 获取指向char的指针并返回指向7个元素的数组的指针,其中每个元素都是指向a的指针 struct Sporcle。

我的回答:

*( (Sporcle*)[7] ) ( *fubar )( char* );

任何人都可以验证我的答案和/或给我一些指示(没有双关语意)吗?

编辑答案:

( (struct Sporcle*)[7] ) *( *fubar )( char* );

最终答案

struct Sporcle *(*(*fubar)(char *))[7];

3 个答案:

答案 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的基类型,structunionenum或使用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*);