我正在尝试打印c#
中特定节点的地址。
这是在现有链表中找到最小的两个元素(假设min1
和min2
)的函数。由于某些原因,我想知道列表中出现的第一个最小值的地址(可能是min1或min2,无论哪个更大或更小,我只需要知道从链表的头部遍历到NULL时找到的第一个最小值的地址)。
我试图这样做,我的代码能够找到最小的两个,我也试图找到第一个最小元素的地址,从break
s的while loop
的头部遍历到达,并将address
存储在地址变量中,并从loop
出来。
但是问题是,它不是打印address的值,而是打印一个长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),但不显示地址,我想看到地址的整数值。
有人能帮我实现我的目标吗?当我尝试使用&
操作符查看地址时,它会给出以下错误。
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
不能这样获取托管对象的内存地址。
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;
}
}
在c#中,使用'&'操作符来引用引用类型的地址
Console.WriteLine("Address check: {0} Its value is : {1}", &address, address.freq);