Нужна помощь в деконструкции RosettaStone Код Хаффмана

Я беру урок по Си с парой друзей. Мы работаем над проектом по кодированию Хаффмана, и я пытаюсь понять версию кода Розеттского камня. Я думаю, что я понял большую часть этого, но я не понимаю пару переменных.

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;

Может кто-нибудь объяснить мне, что означает * узел, и что такое узел qqq[255] и что означает *q = qqq-1.

Единственная причина, по которой я спрашиваю, это то, что я делаю ошибку где-то в моем понимании, потому что я действительно не получаю отношения между этими узлами указателя.

Любая помощь будет принята с благодарностью.

1 ответ

Декларация:

typedef struct node_t { ... } *node;

определяет node введите как указатель на node_t структуры (которые кажутся типичными бинарными поисковыми узлами). Так что пока pool[] это массив node_t структуры, qqq[] является массивом указателей (на упомянутые структуры). Теперь подумай о qqq как указатель на начало некоторых (зарезервированных в стеке) байтов для хранения набора указателей (255*sizeof(node) или же 255*sizeof(struct node_t*) байт).

затем

node ..., *q = ...

похож в том, что он определяет q как указатель на nodeс, но без резервирования каких-либо байтов. Вместо, q инициализируется, чтобы указать на qqq-1 что, вероятно, должно означать "указать на sizeof(node) до qqq".

(Хотя эта последняя часть арифметики указателей, вероятно, работает, указывая вне qqq не является хорошей идеей, потому что добавление вычитающих указателей является определенным поведением, только когда результирующий адрес находится в пределах определенного диапазона.)

Предположительно, что следует цикл, где q это предварительно увеличенный обход итератора qqqс данными.

Другие вопросы по тегам