我正在尝试在c#
中打印特定节点的地址。
这是在现有链表中找到最少两个元素(假设min1
和min2
)的函数。
由于某些原因,我想知道列表中出现的第一个最小值的地址(可能是min1或min2,无论哪个更大或哪个更小,我只需知道找到的第一个最小值的地址)从链表的头部遍历为NULL)。
我尝试这样做,我的代码能够找到最小值的两个,并且我还试图找到while loop
break
中从头部穿过的第一个最小元素的地址并将address
存储在地址变量中,并从loop
开始。
但问题是打印地址值而不是打印长string
,如下所示:
shekhar_final_version_Csharp.Huffman+Node
其中shekhar_final_version_Csharp.Huffman
是namespace
的名称。
以下是代码:
public Node find_two_smallest(ref Node pmin1, ref Node pmin2)
{
Node temp = tree;
Node address = tree;
Node min1 ;
min1 = new Node();
min1.freq = int.MaxValue;
Node min2;
min2 = new Node();
min2.freq = int.MaxValue;
while (temp != null)
{
if (temp.is_processed == 0)
{
if (temp.freq < min2.freq)
{
min1 = min2;
min2 = temp;
}
else if (temp.freq < min1.freq && temp.freq!=min2.freq)
{
min1 = temp;
}
temp = temp.next;
}
}
pmin1 = min1;
pmin2 = min2;
// Below is the code to find the address of first minimum arriving on traversal
// of List.
while (temp != null)
{
if (temp.freq == min2.freq || temp.freq == min1.freq )
{
address=temp;
break;
}
}
// See below the output corresponding to it.
Console.WriteLine("Address check: {0} Its value is : {1}",
address, address.freq);
return address;
}
它的相应输出是:
Address check: shekhar_final_version_Csharp.Huffman+Node Its value is : 88
它正确显示该位置的值(min1 / min2 = 88)但没有显示地址,我想看到地址的整数值。
有人可以帮助我实现目标吗?hanks。
当我尝试使用&
操作符查看地址时,会出现以下错误。
hp@ubuntu:~/Desktop/Internship_Xav/c#$ gmcs check1.cs /unsafe
check1.cs(119,76): error CS0214: Pointers and fixed size buffers may only be used in an unsafe context
check1.cs(119,76): error CS0208: Cannot take the address of, get the size of, or declare a pointer to a managed type `shekhar_final_version_Csharp.Huffman.Node'
check1.cs(12,22): (Location of the symbol related to previous error)
Compilation failed: 2 error(s), 0 warnings
答案 0 :(得分:1)
您无法获取此类托管对象的内存地址。它根本不是该语言的支持功能。
答案 1 :(得分:1)
Console.WriteLine
对传递给它的对象调用ToString()
,然后打印此字符串。 ToString()
的默认行为是打印类型名称。如果您想要其他内容,请在您的课程中覆盖它:
public class Node
{
...
public override string ToString()
{
return Value; // Or whatever properties you want to print.
}
}
注意:在C#中,您无法获取对象的内存地址。这是因为垃圾收集器(GC)可以在收集时重定位对象。如果需要标识对象,请将自己的标识符添加为字段或属性。例如,使用Guid
字段:
public class Node
{
private Guid _guid = Guid.NewGuid();
public override string ToString()
{
return _guid;
}
}
或者使用静态计数器:
public class Node
{
private static int _counter = 0;
private int _id = _counter++;
public override string ToString()
{
return _id;
}
}
答案 2 :(得分:-1)
在c#中引用参考类型的地址时,请使用&#39;&amp;&#39;操作
Console.WriteLine("Address check: {0} Its value is : {1}", &address, address.freq);