1

私はCで二重連結リストを扱っていますが、常に事実として受け入れられていることに気付いた、またはかつて答えを知っていたのに忘れてしまったことに気づきました。これは、ポインターを再び使用し始めたときによく発生し、毎回ポインターを再学習する必要があります。

これが私のセットアップの基本です:

int main(void)
{
    video *head = NULL;
    video *tail = NULL;

    char *buffer = NULL;
    buffer = (char*)malloc(sizeof(MAX_TITLE_LENGTH));

    printf("Enter a title: ");
    fgets(buffer, MAX_TITLE_LENGTH, stdin);

    insert(buffer, &head, &tail);
}

私は構造を持っています:

typedef struct video
{
    char title[MAX_TITLE_LENGTH];
    struct video *prev;
    struct video *next;
}video;

挿入用プロトタイプ:

int insert (char *title, video **head, video **tail);

なぜビデオのアドレスを具体的に渡さなければならないのか疑問に思っています。

文字を渡す方法は、文字列の先頭のメモリ内のアドレスを渡すことを知っています。値にアクセスするために、なぜ head と tail を再度逆参照する必要があるのですか?

これは正直なところ、私が考えているよりも単純です。私はそれを確信しており、ポインターについて考えるのが苦手です。

誰かがそれを緩めることができますか?

ありがとう。

4

1 に答える 1

5

これは、関数insertが what を変更して を指す必要がある場合がheadあるtailためです

C では、関数パラメーターは値渡しであることに注意してください。structこれが、関数で変更したい へのポインターを渡す理由です。ポインターを提供すると、関数はメモリ内の実際の構造体にアクセスできます。

しかし、へのポインタstructは値渡しです。ポインターが指すものを変更したい場合はどうしますか? 単純にコピーされないように、追加のレベルの参照、または実際にポインターを保持するメモリが必要になります。追加のレベル if reference を使用すると、ポインターにアクセスして関数内でポインターを変更し、ポインターが別のものを指すようにすることができます。

これは、要素などを変更する必要があるリンクされたリストコードでよく見られます。リストhead内の他のすべての要素は、おそらく、リスト内の各ノードに含まれるポインターを使用してアクセスできますが、たとえば挿入する必要がある場合ヘッドに新しい要素がある場合、関数はヘッド ポインターを変更する必要があります。関数パラメーターとして渡す場合は、そのアドレスが必要になります。そうしないと、関数はコピーを変更するだけで、変更は関数の外部に反映されません。

于 2012-08-27T21:08:29.127 に答える