You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 21:05:23