试图在c#中获取链表的特定节点的地址

时间:2014-03-14 18:19:18

标签: c# algorithm linked-list memory-address singly-linked-list

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

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

我尝试这样做,我的代码能够找到最小值的两个,并且我还试图找到while loop break中从头部穿过的第一个最小元素的地址并将address存储在地址变量中,并从loop开始。

但问题是打印地址值而不是打印长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)但没有显示地址,我想看到地址的整数值。

有人可以帮助我实现目标吗?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

3 个答案:

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