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 の意味、ノード qqq[255] の意味、*q = qqq-1 の意味を説明してください。

私が尋ねる唯一の理由は、これらのポインターノード間の関係を実際に取得していないため、理解のどこかでエラーを起こしていると思うからです。

4

1 に答える 1

0

宣言:

typedef struct node_t { ... } *node;

型を構造体 (典型的な二分探索ノードのように見える) へのnodeポインターとして定義します。node_twhilepool[]node_t構造体の配列であり、 (構造体への)​​ ポインターqqq[]の配列です。ここで、一連のポインター (またはバイト) を保持するための (スタック予約済み) バイトの先頭へのポインターと考えてください。qqq255*sizeof(node)255*sizeof(struct node_t*)

それで

node ..., *q = ...

qは、sへのポインターとして定義する点で似ていますnodeが、バイトを予約しません。代わりに、おそらく「前を指している」ことを意味するように意図されているq指すように初期化されます。qqq-1sizeof(node)qqq

(この最後のポインター演算はおそらく機能しますqqqが、ポインターの加算と減算は、結果のアドレスが定義された範囲内にある場合にのみ定義された動作であるため、の外側を指すことはお勧めできません。)

おそらく、その後に続くのはq、事前にインクリメントされたイテレータがqqqs データをトラバースするループです。

于 2015-05-08T08:23:08.823 に答える