huansdg 发表于 2023-11-7 00:17:53

-> 运算符

p1.p2 都是指针,但 (p2->next)=p1;    和                p2->next=p1;                运行不一样,为什么?

isdkz 发表于 2023-11-7 00:18:37

这两个表达式的运行结果不同,原因是它们使用了不同的赋值方式。

在表达式(p2->next) = p1; 中,我们使用了括号将 p2->next 包裹起来,这是因为箭头运算符 "->" 的优先级比赋值运算符 "=" 更高。这意味着先执行箭头运算符,获取 p2 指针指向的结构体或对象的 next 成员,然后将 p1 的值赋给这个 next 成员。这样,p2 指针指向的结构体或对象的 next 成员就被修改为 p1 的值。

而在表达式 p2->next = p1; 中,没有使用括号,因此赋值运算符 "=" 的优先级比箭头运算符 "->" 更高。这意味着先执行 p2->next,获取 p2 指针指向的结构体或对象的 next 成员的地址,然后将 p1 的值赋给这个地址。这样,p2 指针指向的结构体或对象的 next 成员的值被修改为 p1 的值。

所以,这两个表达式的运行结果不同。第一个表达式修改了 p2 指针指向的结构体或对象的 next 成员的值,而第二个表达式修改了 p2 指针指向的结构体或对象的 next 成员所存储的地址的值。

Mike_python小 发表于 2023-11-7 00:19:07

在C/C++中,指针的赋值操作是将一个指针变量指向另一个内存地址。

下面来详细解释 (p2->next) = p1; 和 p2->next = p1; 的区别。

1. (p2->next) = p1;:这条语句将指针 p1 的值赋给了 p2 指针指向的 next 成员变量。这意味着我们改变了 p2 所指向的节点的 next 指针,使其指向了 p1 所指向的节点。这实际上改变了链表的结构。

   这种情况下,如果 p2 原本指向的节点的 next 指针不为空,那么该指针将会被覆盖,导致原链表中的一部分节点无法访问。这种操作可能会破坏链表的完整性,导致内存泄漏或者访问错误。

2. p2->next = p1;:这条语句将指针 p1 的值直接赋给了 p2 指针所指向节点的 next 成员变量。这实际上是修改了 p2 所指向节点的 next 指针的值,使其指向了 p1 所指向的节点。

   这种情况下,并没有改变链表的结构,只是将节点的 next 指针指向了另一个节点,保持链表的完整性。

总结来说,(p2->next) = p1; 是将指针 p2 所指向节点的 next 指针的值修改为 p1 的值,而 p2->next = p1; 是将指针 p2 所指向节点的 next 指针直接指向 p1 所指向的节点。

希望这个解释对你有帮助。如果还有其他问题,请随时提问。

球一个最佳答案谢谢啦!这对我非常重要!{:10_254:}{:10_254:}{:10_254:}
页: [1]
查看完整版本: -> 运算符