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