我静态定义了一个myStruct
,在结构体内,我有一个大小为3的innerStruct
数组。我想返回一个指向该数组的指针,这样我就可以指定一个本地指针指向一个的元素,以便稍后修改值。
在某一部分,似乎我的编译器告诉我,我返回的是int而不是innerStruct *
类型。
我该如何正确地做到这一点? 是否需要双指针?
#include <stdio.h>
typedef struct
{
int content;
} innerStruct;
typedef struct
{
int a;
innerStruct inner[3];
} myStruct;
static myStruct m1;
innerStruct * getMyStructPtr()
{
return &(m1.inner);
}
int main()
{
int id = 0;
int elem = 1;
/* Define a local ptr so I can modify values of the m1 struct */
innerStruct * local_ptr = NULL;
innerStruct * myStruct_ptr = getMyStructPtr(); // seems like my compiler tells me I'm returning an int instead of innerStruct * type
/* Point to one of the elements */
local_ptr = &myStruct_ptr[elem];
local_ptr->content = 123;
return 0;
}
链接到在线代码编译器:https://onlinegdb.com/BJNO9lxA-
答案 0 :(得分:3)
以这种方式思考:在您使用数组的上下文中,它实际上等同于指针。例如,m1.inner
实际上可以用作指针innerStruct *
到m1.inner [3]中的第一个元素。
为了获得指向m1.inner
数组中任何一个元素的指针,从innerStruct * getMyStructPtr()
返回时可以执行以下操作。
return m1.inner
return m1.inner + 1
return m1.inner + 2
当然,您应该选择不对+ 1
,+ 2
进行硬编码,而是将其作为参数传递,即
innerStruct * getMyStructPtr(int elementNo)//don't forget it is zero based
{
return m1.inner + elementNo;
}
话虽如此,数组和指针之间当然存在一些差异。如果您仍然有点困惑为什么数组和指针在大多数情况下可以互换,请给this answer一个读数。作者做了非常彻底的解释。
答案 1 :(得分:2)
没有括号的数组的名称是指向数组中第一个元素的指针。功能应该是:
innerStruct* getMyStructPtr()
{
return myStruct.inner;
}
如果您想访问特定元素,则需要:
return &myStruct.inner[2];