temp2
,temp1
是指向某个结构 x 的指针:
struct FunkyStruct x;
struct FunkyStruct *temp1 = &x, *temp2 = &x;
现在,在执行以下几行之后:
temp2=temp1;
temp1=temp1->nxt;
...会temp2
并且temp1
仍然指向相同的内存位置吗?如果不是,请解释为什么它们会有所不同。
最初,temp1
和temp2
都包含 的内存地址x
。
temp2 = temp1
意思是“将值分配temp1
给temp2
”。由于它们开始时具有相同的值,因此该命令不执行任何操作。
该表达式的意思是“查看指向temp1->next
的数据结构,并返回该字段的值。” 因此将 的值分配给。(当然,查找发生在赋值之前。) 现在将包含该字段碰巧包含的任何值。它可能与旧值相同,也可能不同。temp1
next
temp1 = temp1->next
temp1->next
temp1
temp1
next
这听起来像是一个基于java背景的问题?
障碍者给出的答案很好。
要意识到的重要一点是,在 C 中分配指针与分配整数没有什么不同。
考虑对原始代码进行以下修改:
int temp1 = 1;
int temp2;
temp2=temp1;
temp1=temp1 + 1;
在这个 temp1 结束时为 2,temp2 为 1。
这不像在 java 中分配一个(非原始)对象,其中分配实际上分配了对对象的引用而不是值。
temp2 不会更新,但 temp1 将指向下一项。所以如果 temp1 是 0x89abcdef 并且 temp1->next 是 0x89b00000,那么在你完成之后,temp1 将是 0x89b00000 而 temp2 将是 0x89abcdef。
当然,假设您正在制作一个链接列表。
您并没有真正向我们提供足够的信息来回答您的问题。它们是开始指向同一个结构,还是它们都只是指向结构 x 的类型指针?如果是某个 struct x,那么 nxt 字段的定义是什么?
不同的。
您已将 temp1 最初指向的地址保存到 temp2 中。然后,您更改了 temp1 所指向的内容,而不是 temp1 所指向的另一端的变量。
如果你做了
temp2 = temp1;
*temp1 = temp1->foo;
那么 temp1 和 temp2 都将指向(相同的)修改后的变量。
不,假设有像 C 中的指针。 temp2 将指向 x 的位置,而 temp1 将指向 nxt 指针指向的任何位置。通常这将是单链表的布局。
最简洁的答案是不。但前提是nxt与temp1和temp2开始时都不同。
行temp1=temp1->nxt; 有两个部分,由=运算符分隔。这些是:
x(因此 x.nxt)将被初始化为未指定的值,具体取决于编译器、编译器选项和运行时环境的组合。temp1 和 temp2 都将指向 x(在 temp1=temp2 之前和之后)。然后 temp1 将被分配任何值 x.nxt 。
最终答案:0 < Pr(temp1 == temp2) << 1,因为 temp1 == temp2 iff x.nxt == &x。