C指针分配行为

时间:2020-03-06 14:29:42  来源:igfitidea点击:

temp2,temp1是指向某些struct x的指针:

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

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

temp2=temp1;
temp1=temp1->nxt;

... temp2和temp1仍指向相同的存储位置吗?如果没有,请解释为什么它们会有所不同。

解决方案

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指针所指向的内容。通常,这将是单链接列表的布局。

最初," temp1"和" temp2"都包含" x"的内存地址。

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

表达式temp1-> next表示"查看temp1指向的数据结构,并返回字段next的值。"因此," temp1 = temp1-> next"将" temp1-> next"的值分配给" temp1"。 (当然,查找发生在赋值之前。)现在," temp1"将包含" next"字段恰好包含的任何值。它可以与旧值相同,也可以不同。

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

dysfunctor给出的答案是好的。

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

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

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

在此temp1的末尾是2,temp2是1.

这与在Java中分配一个(非原始)对象不同,在Java中,分配实际上分配了对该对象的引用而不是值。

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

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

最简洁的答案是不。但是仅当nxt与temp1和temp2都不相同时才开始。

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

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