2

对成员引用和指针运算符的功能有些担忧。

举个例子:

struct ID{
    uint8_t index;
    bool active;
}

struct Square{
    struct ID shortID;
    struct BUDDY *bud;
    uint8_t x;
    uint8_t y;
};

然后我稍后返回一个指向正方形的指针。我的问题是:然后我可以修改 ID 的成员并将更改反映在嵌套结构中吗?

void function1()
{
    Square *someSquare = GetSquare(1);
    someSquare->shortID.index = 89; // Is this now reflected everywhere? OR was the shortID struct only modified in the scope of this funciton..
}

void function2()
{
    Square *someSquare = GetSquare(1);
    if ( someSquare->shortID.index != 89 )
    {
        // Dang...
    }
}

谢谢!

编辑:

感谢简洁的答案,是的 GetSquare 函数返回一个指向正方形数组的指定索引的指针。像这样:

Square* GetSquare( uint8_t index )
{
    return &squares[index];  
}

所以实例应该每次都相同,因为“squares”数组在对象创建时分配一次。所以感谢您的洞察力,我的问题必须在我的代码中的其他地方:)

4

5 回答 5

2

Square* 是的,因为 someSquare 是 a->运算符就像 a (*varname).。所以它是指针的内容,你得到 type Square。然后你可以用 修改变量.,因为它是一个结构,所有变量都是公共的,不像在类中那样。

GetSquare如果返回相同的对象,您在 function1 中所做的更改可以在 function2 中看到,如果您GetSquare看起来像这样,则可能是这种情况。

Square * GetSquare(int i)
{
    static Square * pSquare = 0;
    if (pSquare)
        pSquare = malloc(sizeof(static Square));
    return pSquare;
}

或者像这样的全局变量

static Square pSquare ;

Square * GetSquare(int i)
{
    return &pSquare;
}
于 2012-11-23T07:27:55.587 回答
1

如果 function1 中的 Square 指针与 function2 中的 Square 指针指向同一个 Square,那么是的,您将在 function2 中看到 function1 中设置的值(假设函数按该顺序调用)。

如果指针指向不同的实例,您将看不到该值。

正如 juanchopanza 所指出的,这完全取决于您的 GetSquare 函数的作用。请发布该功能的定义。

于 2012-11-23T07:32:41.107 回答
0

它将在范围内,因为您没有使用任何形式的全局实例。我不知道 getSquare 实际上做了什么,但我假设它实例化了 Square 类并返回实例......

于 2012-11-23T07:26:31.530 回答
0

访问someSquare->someID.index就像访问一样someSquare->x——在这两种情况下,它都会修改指向的对象someSquare(在第一种情况下,它正在修改子对象)。

于 2012-11-23T07:29:16.553 回答
0

是的,如果 GetSquare(1) 返回相同的实例,那么更改也应该反映在 function2() 中。如果您想确定返回的实例是相同的,请尝试通过以下语句打印指针 someSquare 的值:

printf("Value of pointer: %p \n",someSquare);

如果此值相同,则表示它们是相同的实例,更改应反映在 function2() 中。

GetSquare 也应该是任何类之外的全局函数或静态函数。如果它是实例函数,那么它将为不同的类对象访问不同的类“Square”数组。

除此之外,我无法根据可用的代码给出其他意见。

于 2012-11-24T04:10:02.110 回答