C#数组转链表代码中方法内变量的内存分配疑问
关于C#链表转换中引用变量的内存逻辑说明
首先明确:你觉得root对象被修改是个误解——ptr = ptr.Next这个操作不会修改root指向的对象,也不会改变root变量的指向,它只改变ptr自己的指向。
核心逻辑:C#引用类型的变量本质
- 链表节点这类类属于引用类型,变量(比如root、ptr)存的不是对象本身,而是对象在堆内存中的地址。
- 执行
ptr = root后,ptr和root确实指向同一个堆内存地址,也就是同一个节点对象。 - 但
ptr = ptr.Next只是把ptr变量里存储的地址,替换成ptr.Next指向的那个节点的地址——这个操作完全没碰root变量里的地址,也没修改root指向的原节点的任何内容。
什么时候root指向的对象才会被修改?
只有当你通过ptr修改节点的属性/字段时,才会影响root指向的对象。比如:
// 假设root指向第一个节点,ptr和root指向同一个对象 ptr.Next = new ListNode(3); // 此时root.Next也会变成这个新节点,因为root和ptr指向的是同一个对象,修改的是对象的属性
代码示例验证
public class ListNode { public int Val; public ListNode Next; public ListNode(int val) => Val = val; } // 测试代码 var root = new ListNode(1); root.Next = new ListNode(2); var ptr = root; // 仅改变ptr的指向 ptr = ptr.Next; Console.WriteLine(root.Val); // 输出1,root指向的对象完全没变化 // 修改ptr指向对象的属性 ptr.Val = 100; Console.WriteLine(root.Next.Val); // 输出100,因为root.Next和ptr指向同一个对象
内容的提问来源于stack exchange,提问作者vjalex
相关产品推荐
相关产品推荐

