C指针分配行为
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的值。