【问题标题】:Declaring a function pointer returning an array声明返回数组的函数指针
【发布时间】:2014-11-25 08:47:37
【问题描述】:

为了练习,我正在尝试:

fubar 声明为一个指向函数的指针,该函数接受一个指向char 的指针并返回一个指向由24 个元素组成的数组的指针,其中每个元素都是指向struct foo 的指针。

我的逻辑是:

-fubar 是一个指向采用 char 指针的函数的指针: (*fubar)(char*)

-...返回一个指向 24 个元素的数组的指针,其中每个元素都是一个 struct foo:

(struct foo *)(*fubar)(char*)[24]

我的逻辑对吗?

【问题讨论】:

  • 没有。括号有很大的不同。它应该是struct foo* (*fubar)(char*)[24],这才是有效的语法。
  • 你知道cdecl (cdecl.org)吗?
  • 是的,我知道 cdecl,但它说语法错误,但我不知道为什么。
  • (struct foo *) 是一种类型转换,在这种情况下没有任何意义。您可以尝试删除括号:cdecl.ridiculousfish.com/?q=struct+foo+*%28*fubar%29%28char*%29[24] 然后它就不再是语法错误了。
  • @mch 啊啊啊我明白了!感谢您添加该评论,我想我终于更了解它了

标签: c pointers function-pointers


【解决方案1】:

修复语法错误并删除struct foo *周围的括号后,

struct foo* (*fubar)(char*)[24]

...您弄错的一个部分是它实际上返回了一个 of 指针数组,而不是指向数组的指针。为了声明指向数组的指针,您需要一组额外的括号:

struct foo (*(*fubar)(char*))[24]

您可以假设星号属于括号内的标识符(即数组的名称)。

【讨论】:

  • 快速提问:去掉外括号会改变语句吗? struct foo *(*fubar)(char*)[24]是一样的吗?
  • @Penu 就像我说的,括号很重要。修复语法错误会导致您刚刚描述的形式,它返回一个指针数组。括号改变了复杂声明符的绑定
  • 谢谢。我一直在想,但实际上答案应该是:struct foo *(*(*fubar)(char*))[24]
  • @penu 不,它返回一个指向指针数组的指针。我正在展示的语法演示了如果您的理解正确,它会是什么样子。
【解决方案2】:

函数从不返回数组,它们可能会返回一个指针(通常指向数组的第一个单元格),因为作为返回值或作为参数的数组衰减为指针。

所以,用typedef 声明你的函数签名:

typedef struct foo** funsig_t(char*);

请注意,如果您省略 typedef,您将声明 所需签名函数 funsig_t

然后使用该 typedef 声明一个指针:

funsig_t* fubar;

【讨论】:

    猜你喜欢
    • 2013-03-16
    • 2018-11-11
    • 2016-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多