试图在c#中获得linkedlist的特定节点的地址



我正在尝试打印c#中特定节点的地址。

这是在现有链表中找到最小的两个元素(假设min1min2)的函数。由于某些原因,我想知道列表中出现的第一个最小值的地址(可能是min1或min2,无论哪个更大或更小,我只需要知道从链表的头部遍历到NULL时找到的第一个最小值的地址)。

我试图这样做,我的代码能够找到最小的两个,我也试图找到第一个最小元素的地址,从break s的while loop的头部遍历到达,并将address存储在地址变量中,并从loop出来。

但是问题是,它不是打印address的值,而是打印一个长string,如下所示:

shekhar_final_version_Csharp.Huffman+Node  

其中shekhar_final_version_Csharp.Huffmannamespace的名称。

代码如下:

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);

相关内容

  • 没有找到相关文章

最新更新