C ++ Struct本身?

时间:2010-05-21 20:54:29

标签: c++ python c huffman-code

我一直在尝试将这段代码移植到python中,但是在C ++中有一些我不太懂的东西(我确实知道一些C ++,但这超出了我的范围):

typedef struct huffnode_s
{
    struct huffnode_s *zero;
    struct huffnode_s *one;
    unsigned char val;
    float freq;
} huffnode_t;

我没有得到的是huffnode_s本身是如何形成的,我以前从未见过它并且不太了解它。这是什么意思,如果有人可以,那将是什么蟒蛇等同?

8 个答案:

答案 0 :(得分:19)

huffnode_s不在其中,只有指针huffnode_s。由于指针的大小已知,所以没问题。

答案 1 :(得分:11)

此。

class Huffnode(object):
    def __init__(self, zero, one, val, freq):
        """zero and one are Huffnode's, val is a 'char' and freq is a float."""
        self.zero = zero
        self.one = one
        self.val = val
        self.freq = freq

然后,您可以将各种C函数重构为此类的方法。

或许这个。

from collections import namedtuple
Huffnode = namedtuple( 'Huffnode', [ 'zero', 'one', 'val', 'freq' ] )

如果您希望C函数保持功能。

就是这样。

h0 = Huffnode(None, None, 'x', 0.0)
h1 = Huffnode(None, None, 'y', 1.0)
h2 = Huffnode(h0, h1, 'z', 2.0)

这就是所需要的。

答案 2 :(得分:4)

它本身没有结构。它有一个指向该结构的指针。

内存中的

struct huffnode_s 看起来像(32位机器):


| ------------------ huffnode_s * zero - 4个字节-------------- |

| ------------------ huffnode_s * one - 4 bytes ---------------- |

| unsigned char val - 1字节+ 3字节填充======= |

| ------------------- float freq - 4个字节---------------------- --- |


这些尺寸会因机器而异,它在内存中的外观由编译器决定。

答案 3 :(得分:1)

为了补充Carl的答案,C ++中也可以这样做:

class Foo {
public:
    Foo() {}

    Foo *anotherFoo;
};   

(注意上面的类是愚蠢的,但重点是你可以在一个类类型的类中有一个指针)

答案 4 :(得分:0)

正如其他人所指出的那样,对自身的引用只是指向该结构的其他实例的指针。

结构中的指针允许用户将实例连接在一起作为链表。

答案 5 :(得分:0)

(struct huffnode_s *)声明指向另一个结构的指针,该结构包含与其声明的结构相同的变量。请参阅this question

答案 6 :(得分:0)

这是一个指向huffnode内部的huffnode的指针。这意味着您可以说:

huffnode_t *node = ...;
huffnode_t *greatgreatgreatgrandchild = node->zero->zero->zero->zero->zero;

这将编译,只要所有那些huffnode后代实际分配并指向正确,它就会起作用。

指针很像JavaScript中的对象引用。它们实际上并不包含数据,只是引用它。请放心,你不是在看无限型。

答案 7 :(得分:0)

这被称为自引用结构,它听起来就像它:一个包含对自身的引用的结构。这种情况的常见现象是描述链表节点的结构。每个节点都需要引用链中的下一个节点。

struct linked_list_node { 
    int data; 
    struct linked_list_node *next; // <- self reference 
};