C 从函数名后带有数组维度的函数返回指向数组的指针

C 从函数名后带有数组维度的函数返回指向数组的指针,c,arrays,pointers,return,C,Arrays,Pointers,Return,我在代码库中遇到了这个奇怪的函数声明,我想帮助理解: struct MemberStruct (*GetMember ( CONTAINER_STRUCT *Buffer ))[DIM_1][DIM_2][DIM_3] { return(&Buffer->MemberStructArray); } 它的行为类似于伪访问器。它返回CONTAINER\u STRUCT中MemberStruct数组的地址 CONTAINER\u STRUCT具有以下定义: ty

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

struct MemberStruct (*GetMember ( 
    CONTAINER_STRUCT *Buffer 
    ))[DIM_1][DIM_2][DIM_3]
{
  return(&Buffer->MemberStructArray);
}
它的行为类似于伪访问器。它返回
CONTAINER\u STRUCT
MemberStruct
数组的地址

CONTAINER\u 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);
我想更好地理解函数签名,但还没有在网上找到这种构造的任何示例。我的具体问题是:

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

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

    GetMember()
    
    它接受一个类型为
    CONTAINER\u STRUCT*
    的参数:

    GetMember(CONTAINER_STRUCT *)
    
    并返回一个指针:

    *GetMember(CONTAINER_STRUCT *)
    
    要创建三维阵列,请执行以下操作:

    (*GetMember(CONTAINER_STRUCT *))[DIM_1][DIM_2][DIM_3]
    
    结构成员结构的

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

    谢谢你的帮助。我想任何后续问题的答案都是“因为C就是这样”。这是“到3D阵列”的一部分,让我很反感。对于我来说,数组维度在括号外和函数名右侧没有意义。这看起来像是指向我的函数指针数组。@skrrgwasme:如果
    a[N]
    是数组,那么
    *ap[N]
    是指针数组,
    (*pa)[N]
    是指向数组的指针。将
    pa
    替换为
    f()
    ,您将得到
    (*f())[N]
    ,或者一个返回数组指针的函数。是的,这就是C声明程序语法的工作原理。函数声明符语法类似-如果
    f()
    是函数,则
    *fp()
    是返回指针的函数,
    (*pf)(
    是指向函数的指针。将
    pf
    替换为
    a[N]
    ,您就有了一个指向函数的指针数组-
    (*a[N])()
    。知道总是有用的。正如@Someprogrammerdude cdecl.org在我尝试的时候被堵住了一样。但我会再复习一下精神法则。谢谢你的链接。