从函数返回指向数组的指针,函数名称后具有数组维度

Posted

技术标签:

【中文标题】从函数返回指向数组的指针,函数名称后具有数组维度【英文标题】:Return pointer to array from function with array dimensions after function name 【发布时间】:2019-01-03 21:16:11 【问题描述】:

我在我的代码库中遇到了这个奇怪的函数声明,希望帮助理解:

struct MemberStruct (*GetMember ( 
    CONTAINER_STRUCT *Buffer 
    ))[DIM_1][DIM_2][DIM_3]

  return(&Buffer->MemberStructArray);

它的行为类似于伪访问器。它返回CONTAINER_STRUCTMemberStruct 数组的地址。

CONTAINER_STRUCT 有这样的定义:

typedef struct ContainerStruct 
  // Other members
  struct MemberStruct        MemberStructArray[DIM_1][DIM_2][DIM_3];
  // Other members
 CONTAINER_STRUCT;

这个函数是这样调用的:

// declarations at the top of a function
struct MemberStruct (*MemberStructArray)[DIM_1][DIM_2][DIM_3];
CONTAINER_STRUCT Container;

// Other code, including the initialization of Container

MemberStructArray = GetMember(&Container);

我想更好地理解函数签名,但无法在网上找到此构造的任何示例。我的具体问题是:

    函数名称后的数组维度如何工作?当函数名称介于返回类型和维度之间时,它们与返回类型有何关系? 为什么*符号在函数名的括号内?既然这是返回地址,那么引用运算符不应该绑定到返回类型而不是函数名吗?

【问题讨论】:

The clockwise/spiral rule 总是有用的。正如cdecl.org @Someprogrammerdude cdecl.org 在我尝试时对此感到震惊。但我会再次审查螺旋规则。感谢您的链接。 【参考方案1】:

分解声明:GetMember 是一个函数:

GetMember()

这需要一个CONTAINER_STRUCT *类型的参数:

GetMember(CONTAINER_STRUCT *)

并返回一个指针:

*GetMember(CONTAINER_STRUCT *)

到 3D 数组:

(*GetMember(CONTAINER_STRUCT *))[DIM_1][DIM_2][DIM_3]

struct MemberStruct:

struct MemberStruct (*GetMember(CONTAINER_STRUCT *))[DIM_1][DIM_2][DIM_3]

【讨论】:

感谢您的分解。我想任何后续问题的答案都是“因为这就是 C 的方式”。让我失望的是“To a 3D array”部分。数组维度位于括号之外和函数名称的右侧对我来说没有意义。这看起来像是指向我的函数指针数组。 @skrrgwasme:如果a[N] 是一个数组,那么*ap[N] 是一个指针数组,(*pa)[N] 是一个指向数组的指针。将pa 替换为f(),您将得到(*f())[N],或者一个返回指向数组的指针的函数。是的,这就是 C 声明符语法的工作原理。函数声明符语法类似——如果f()是一个函数,那么*fp()是一个返回指针的函数,而(*pf)()是一个指向函数的指针。将pf 替换为a[N],你就有了一个指向函数的数组——(*a[N])()

以上是关于从函数返回指向数组的指针,函数名称后具有数组维度的主要内容,如果未能解决你的问题,请参考以下文章

从 C++ 中的函数返回指向数组的指针?

C ++从函数返回指向数组的指针的正确方法

从指向函数指针数组的指针中存储返回值如何工作?

C语言基础:C 中数组详解(多维数组传递数组给函数 从函数返回数组 指向数组的指针 )

函数指针

C语言基础:指针相关概念(指针的算术运算 指针数组指向指针的指针 传递指针给函数 从函数返回指针 )为啥C 语言不支持在调用函数时返回局部变量的地址?