【问题标题】:C pointer assignment behaviorC 指针赋值行为
【发布时间】:2010-09-11 16:46:32
【问题描述】:

temp2, temp1 是指向某个结构 x 的指针:

struct FunkyStruct x;
struct FunkyStruct *temp1 = &x, *temp2 = &x;

现在,在执行以下几行之后:

temp2=temp1;
temp1=temp1->nxt;

...temp2temp1 是否仍会指向同一个内存位置?如果不是,请解释为什么它们会有所不同。

【问题讨论】:

  • 呃,两个错误。它应该是 Struct FunkyStruct *temp1 = &x, *temp2 = &x;
  • 谢谢,总站 - 那是我的错(编辑太快)。

标签: c memory pointers


【解决方案1】:

最初temp1temp2都包含x的内存地址。

temp2 = temp1 表示“将temp1 的值分配给temp2”。由于它们开始时具有相同的值,因此该命令什么也不做。

表达式temp1->next 的意思是“查看temp1 指向的数据结构,并返回字段next 的值。”所以temp1 = temp1->nexttemp1->next 的值赋给temp1。 (当然,查找发生在分配之前。)temp1 现在将包含next 字段碰巧包含的任何值。它可能与旧值相同,也可能不同。

【讨论】:

  • 和 temp2 将有不同的值(哦,使用 wiki 功能的能力)
【解决方案2】:

这听起来像是一个基于java背景的问题?

dysfunctor给出的答案很好。

需要意识到的重要一点是,在 C 中分配指针与分配整数没有什么不同。

考虑对您的原始代码进行以下修改:

 int temp1 = 1;
 int temp2;
 temp2=temp1;
 temp1=temp1 + 1;

在这个temp1的末尾是2,temp2是1。

这不像在 java 中分配一个(非原始)对象,其中的分配实际上是分配对对象的引用而不是值。

【讨论】:

    【解决方案3】:

    temp2 不会更新,但 temp1 将指向下一项。所以如果 temp1 是 0x89abcdef 并且 temp1->next 是 0x89b00000,那么在你完成之后,temp1 将是 0x89b00000 而 temp2 将是 0x89abcdef。

    当然,假设您正在制作一个链接列表。

    【讨论】:

      【解决方案4】:

      您并没有真正向我们提供足够的信息来回答您的问题。它们是开始指向同一个结构,还是它们都只是指向结构 x 的类型指针?如果是一些struct x,nxt字段的定义是什么?

      【讨论】:

        【解决方案5】:

        不,假设有像 C 中的指针。 temp2 将指向 x 的位置,而 temp1 将指向 nxt 指针指向的任何位置。通常这是单链表的布局。

        【讨论】:

          【解决方案6】:

          不同。

          您已将 temp1 最初指向的地址保存到 temp2 中。然后,您更改了 temp1 所指向的内容,而不是 temp1 所指向的另一端的变量。

          如果你这样做了

          temp2 = temp1;
          *temp1 = temp1->foo;
          

          那么 temp1 和 temp2 都将指向(同一个)修改后的变量。

          【讨论】:

            【解决方案7】:

            x(因此 x.nxt)将被初始化为未指定的值,具体取决于编译器、编译器选项和运行时环境的组合。 temp1 和 temp2 都将指向 x(在 temp1=temp2 之前和之后)。然后 temp1 将被分配 x.nxt 的任何值。

            最终答案:0

            【讨论】:

              【解决方案8】:

              简短的回答是否定的。但前提是 nxttemp1temp2 都不同。

              temp1=temp1->nxt; 行有两部分,由 = 运算符分隔。它们是:

              • 右侧temp1->nxt 查找temp1 指向的结构,并获取nxt 变量的值。这是一个指针(新的内存位置)。
              • 然后使用右侧的指针更新 temp1 的值。

              【讨论】:

                猜你喜欢
                • 2019-07-10
                • 2011-10-27
                • 1970-01-01
                • 2011-01-20
                • 2013-05-15
                • 2017-08-20
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多