有人可以帮助我处理列表元素 (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 = ¤tElement.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;
}
没有数据项的元素是没有意义的,因此您应该修改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 上搜索IntPtr
和PInvoke
:有很多),但通常您不需要它们。 如注释中所述,C# 是一种托管语言,它为您提供对象引用而不是指针,处理大多数malloc
、free
以及与指针和动态内存分配相关的其他讨厌的问题(警告:查看 IDisposable 接口,因为这并非普遍正确,尤其是在处理非托管资源(例如某些类型的流的句柄)时, 数据库会话等)。 将变量声明为派生自System.Object
的任何类型的变量时,该变量将是对该对象的引用,而不是对象本身。 因此,对象成员由没有 C# 版本的 object->member
运算符的 object.member
访问,您可以在 C 和 C++ 中找到。
(上面的解释有些简化,我做了几个笼统的概括,但这个主题比这个简短的答案所能涵盖的要广泛得多,如果你需要进一步阅读,有很多好书。