"."和"->"操作员的混合链

Mixing chains of "." and "->" operators

本文关键字:混合 操作员 gt      更新时间:2023-10-16

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

举个例子:

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"数组在创建对象时分配一次。因此,感谢您的见解,我的问题一定在我的代码:)的其他地方

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

如果在函数 2

中返回的GetSquare返回的对象与GetSquare如下所示时可能出现的相同对象,则可以在函数 2 中看到您在函数 1 中所做的更改。

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;
}

如果函数 1 中的方形指针指向与函数 2 中的方形指针相同的平方,那么是的,您将看到函数 2 中函数 1 中设置的值(前提是按该顺序调用函数)。

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

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

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

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

是的

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

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

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

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

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