混合“。”链。和“ - >”运营商

时间:2012-11-23 07:23:13

标签: c++ c pointers nested chaining

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

采用以下示例:

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

因此实例应该每次都相同,因为“square”数组在创建对象时被分配一次。所以,谢谢你的见解我的问题必须在我的代码的其他地方:)

5 个答案:

答案 0 :(得分:2)

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

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

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 :(得分:1)

如果function1中的Square指针指向与function2中的Square指针相同的Square,则是,您将看到function2中function1中设置的值(假设函数在该序列中被调用)。

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

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

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

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

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