返回指向静态定义的结构数组的指针

时间:2017-10-27 00:11:51

标签: c pointers struct

我静态定义了一个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-

2 个答案:

答案 0 :(得分:3)

以这种方式思考:在您使用数组的上下文中,它实际上等同于指针。例如,m1.inner实际上可以用作指针innerStruct *到m1.inner [3]中的第一个元素。

为了获得指向m1.inner数组中任何一个元素的指针,从innerStruct * getMyStructPtr()返回时可以执行以下操作。

  1. 获取指向第一个元素的指针:return m1.inner
  2. 获取指向第二个元素的指针:return m1.inner + 1
  3. 获取指向第三个元素的指针:return m1.inner + 2
  4. 当然,您应该选择不对+ 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];