C 定义变量时从右向左的复杂规则

C 定义变量时从右向左的复杂规则,c,variables,pointers,right-to-left,C,Variables,Pointers,Right To Left,这就是问题: 使用左右规则编写名为fubar的变量的C定义,fubar是指向以下函数的指针: 获取一个指向字符的指针,并返回一个指向由7个元素组成的数组的指针,其中每个元素都是指向 结构孢子 我的答覆是: *((孢子*)[7])(*fubar)(char*) 有谁能验证我的答案和/或给我一些建议(没有双关语) 编辑答案: ((struct spocle*)[7])*(*fubar)(char*) 最终答案 struct Sporcle*(*(*fubar)(char*)[7]是您的朋友: cde

这就是问题:
使用左右规则编写名为fubar的变量的C定义,fubar是指向以下函数的指针: 获取一个指向字符的指针,并返回一个指向由7个元素组成的数组的指针,其中每个元素都是指向 结构孢子

我的答覆是:

*((孢子*)[7])(*fubar)(char*)

有谁能验证我的答案和/或给我一些建议(没有双关语)

编辑答案:

((struct spocle*)[7])*(*fubar)(char*)

最终答案

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

是您的朋友:

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]

我不会对有效性发表评论,但我会提供一个指针:不要这样做。除非这是一个纯粹的智力练习,否则重构声明使其不那么复杂:

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

一次制作一块:

名为
fubar
的变量

fubar
…那是一个指针

*fubar
*(*fubar)(char *)
*(*(*fubar)(char *))[7]
…到一个函数

(*fubar)()
…它接受指向字符的指针

(*fubar)(char *)
…并返回一个指针

*fubar
*(*fubar)(char *)
*(*(*fubar)(char *))[7]
…到一个由7个元素组成的数组

(*(*fubar)(char *))[7]
…其中每个元素都是指针

*fubar
*(*fubar)(char *)
*(*(*fubar)(char *))[7]
…到一个
struct spocle

struct Sporcle *(*(*fubar)(char *))[7]
您的答案不正确-左侧的东西(称为声明说明符)只能直接指定类型(基本类型,如
int
struct
union
enum
或使用
typedef
定义的类型名称,可以选择使用存储类说明符(如
static
和/或类型说明符(如
const
)进行修改).指针、数组和函数类型是通过修改声明的右侧(称为声明器),向其添加
*
[]
()
来构造的


在本例中,声明说明符是
struct spocle
,其余的是声明符。

我认为您不需要最左边的
*
是吗?试着写下:指向一个由7个元素组成的数组的指针,其中每个元素都是指向一个struct spocle的指针。我被“返回一个指向数组的指针…”甩了因此,我认为返回值本身应该是一个指针,该指针将指向七个Sporcle*元素。
struct
关键字?很抱歉指出了最明显的编辑。@初学者,它是:(Sporcle*)[7]*fubar吗?prelic,感谢您捕捉到了这个元素。
[7]
需要在第一组括号内,因为我们返回的是一个指向7个元素数组的指针,而不是7个指针?还是我读错了?@lordmarinara-
声明行有意义吗?如果它是对的,那么输出是对的……我不确定我是否得到了您所要求的区别。我们在这里试图帮助somebody来理解这个主题,你正在发布完整的解决方案…………解决方案不是重要的部分。解决方案是使用一个工具——在这个例子中是
cdecl
——而不是试图用你的大脑解析这种垃圾。这就是为什么我们有计算机。你看,OP不再感兴趣了。我怀疑这是因为你r post.@lordmarinara:如果你遵循这种方法,考试中要记住的一件事是,如果你要对声明符应用
[]
()
,而最后应用的是
*
,你必须首先在现有声明符周围添加括号。(添加
()
指向除初始标识符以外的任何对象,因为您不能有函数数组或函数返回函数(只有函数指针数组或函数返回函数指针)。