C指针赋值行为

时间:2008-09-20 22:39:42

标签: c memory pointers

temp2temp1是指向某个struct x的指针:

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

现在,执行以下行后:

temp2=temp1;
temp1=temp1->nxt;

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

8 个答案:

答案 0 :(得分:10)

最初,temp1temp2都包含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; 这一行有两部分,由 = 运算符分隔。这些是:

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