有人可以帮助我处理列表元素 (C#) 的物理地址吗?

本文关键字:物理地址 列表元素 帮助 处理 | 更新日期: 2023-09-27 18:35:10

我需要用 C# 创建一个项目来展示链表的工作原理。

我想做这样的东西:

root -> (address ffff) value: 5; next: fff1; 
                  -> (address fff1) value: 4; next: fff2; 

。等等...
这在 C# 中可能吗?有人可以告诉我它是如何完成的吗?

好的,这是我到目前为止所拥有的:

class ListaSI
{
    public class element
    {
        public element next = null;
        public object data;
    }
    private element root = null;
    public element First { get { return root; } }
    public element Last
    {
        get
        {
            element currentElement = root;
            if (currentElement == null)
                return null;
            while (currentElement.next != null)
                currentElement = currentElement.next;
            return currentElement;
        }
    }
    // basic operations ( add, delete, etc... )

好吧,我需要"数据"字段的地址。我试试这个:http://msdn.microsoft.com/en-US/library/zcbcf4ta%28v=vs.80%29.aspx,但它不起作用。

不让我这样做:

int *p = &currentElement.next;  // I'm sure this is wrong! :)

但我需要这样的东西吗?

这是我尝试的:

public string displayList()
    {
        string myString = "";
        element currentElement = this.root;
        while (true)
        {
            if (currentElement.next != null)
            {
                // i'm stuck here
            }

        }
        return myString;
    }

有人可以帮助我处理列表元素 (C#) 的物理地址吗?

没有数据项的元素是没有意义的,因此您应该修改element构造函数以包含数据项的参数。

public class element
{
    public element next = null;
    public object data = null;
    public element(object dataItem)
    {
        this.data = dataItem;
    }
}

然后,要使用 displayList 方法访问列表的内容 - 我对您想要显示的内容做了一些假设,但您会明白这一点。

public string displayList()
{
    // Use a StringBuilder to concatenate strings from the list
    StringBuilder myString = new StringBuilder();
    // Iterate through the list, starting at the root.
    element currentElement = this.root;
    while (currentElement != null)
    {
        // Add the data item from the current element
        String dataString = currentElement.data as String;
        if(null != dataString)
        {
            myString.Add(dataString + Environment.NewLine);
        }
        else
        {
            myString.Add("null" + Environment.NewLine);
        }
        // Try the next element in the list.
        currentElement = currentElement.next;
    }
    return myString.ToString();
}

为了澄清指针和 C#,有一些方法可以在 C# 中获取指针(例如在 SO 上搜索IntPtrPInvoke:有很多),但通常您不需要它们。 如注释中所述,C# 是一种托管语言,它为您提供对象引用而不是指针,处理大多数mallocfree以及与指针和动态内存分配相关的其他讨厌的问题(警告:查看 IDisposable 接口,因为这并非普遍正确,尤其是在处理非托管资源(例如某些类型的流的句柄)时, 数据库会话等)。 将变量声明为派生自System.Object的任何类型的变量时,该变量将是对该对象的引用,而不是对象本身。 因此,对象成员由没有 C# 版本的 object->member 运算符的 object.member 访问,您可以在 C 和 C++ 中找到。

(上面的解释有些简化,我做了几个笼统的概括,但这个主题比这个简短的答案所能涵盖的要广泛得多,如果你需要进一步阅读,有很多好书。