-1

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

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

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

temp2=temp1;
temp1=temp1->nxt;

...会temp2并且temp1仍然指向相同的内存位置吗?如果不是,请解释为什么它们会有所不同。

4

8 回答 8

10

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

temp2 = temp1意思是“将值分配temp1temp2”。由于它们开始时具有相同的值,因此该命令不执行任何操作。

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

于 2008-09-20T22:50:35.283 回答
7

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

障碍者给出的答案很好。

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

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

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

在这个 temp1 结束时为 2,temp2 为 1。

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

于 2008-09-20T23:42:28.950 回答
2

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

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

于 2008-09-20T22:41:27.553 回答
1

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

于 2008-09-20T22:42:44.727 回答
1

不同的。

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

如果你做了

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

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

于 2008-09-20T22:43:11.433 回答
1

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

于 2008-09-20T22:44:59.043 回答
0

最简洁的答案是不。但前提是nxt与temp1temp2开始时都不同。

temp1=temp1->nxt; 有两个部分,由=运算符分隔。这些是:

  • 右侧的temp1->nxt查找temp1指向的结构并获取nxt变量的值。这是一个指针(新的内存位置)。
  • 然后使用右侧的指针来更新temp1的值。
于 2008-09-21T07:34:07.257 回答
0

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

最终答案:0 < Pr(temp1 == temp2) << 1,因为 temp1 == temp2 iff x.nxt == &x。

于 2008-09-21T03:47:57.550 回答