从函数返回指向数组的指针,函数名称后具有数组维度
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_STRUCT
中MemberStruct
数组的地址。
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 语言不支持在调用函数时返回局部变量的地址?