0

我正在和几个朋友一起上 C 的课程。我们正在做一个关于霍夫曼编码的项目,我正在尝试理解代码的罗塞塔石碑版本。我想我已经弄清楚了大部分,但我不了解几个变量。

typedef struct node_t {
    struct node_t *left, *right;
    int freq;
    char c;
} *node;

struct node_t pool[256] = { { 0 } };
node qqq[255], *q = qqq - 1;

谁能给我解释一下*node是什么意思,node qqq[255]是什么,*q = qqq-1是什么意思。

我问的唯一原因是我认为我在理解的某个地方犯了错误,因为我并没有真正了解这些指针节点之间的关系。

4

1 回答 1

0

声明:

typedef struct node_t { ... } *node;

node类型定义为指向node_t结构的指针(这似乎是典型的二分搜索节点)。所以 whilepool[]是一个node_t结构数组,qqq[]是一个指针数组(指向所述结构)。现在将其qqq视为指向某些(堆栈保留)字节开始的指针,以保存一堆指针(255*sizeof(node)255*sizeof(struct node_t*)字节)。

然后

node ..., *q = ...

相似之处在于它定义q为指向nodes 的指针,但不保留任何字节。相反,q被初始化为指向qqq-1可能意指“指向sizeof(node)之前qqq”的指向。

(虽然这最后一块指针算术可能有效,但指向外部qqq并不是一个好主意,因为只有当结果地址在定义的范围内时,添加减法指针才是定义的行为。)

假设,接下来是一个循环,其中q是一个预递增的迭代器遍历qqqs 数据。

于 2015-05-08T08:23:08.823 回答