【问题标题】:Mixing chains of "." and "->" operators“.”的混合链和“->”运算符
【发布时间】:2012-11-23 07:23:12
【问题描述】:

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

举个例子:

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”数组在对象创建时分配一次。所以感谢您的洞察力,我的问题必须在我的代码中的其他地方:)

【问题讨论】:

  • 这完全取决于GetSquare 的作用。它是每次返回不同的实例,还是相同的实例?
  • -1 请复制并粘贴真实代码。对于上面的伪装代码,至少修复缩进并添加必要的分号。你让人们猜测!

标签: c++ c pointers nested chaining


【解决方案1】:

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

如果GetSquare 返回的对象与您的GetSquare 看起来像这样的情况相同,则可以在函数2 中看到您在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;
}

【讨论】:

  • 如果他不使用全局实例,它仍然在函数的范围内......他可能只是每次都在创建新实例。
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 您不能从发布的代码中这么说。 GetSquare(1) 可能会返回指向同一实例的指针。
    • 我知道,但我只是说。我认为第一个参数只是设置一个值,或者从数据库中提取......我们不知道是什么问题。
    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

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

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

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

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

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

      【讨论】:

        猜你喜欢
        • 2020-11-08
        • 2017-06-13
        • 2023-03-23
        • 2021-10-27
        • 2023-03-07
        • 2013-04-03
        • 1970-01-01
        • 2017-08-26
        • 1970-01-01
        相关资源
        最近更新 更多