なぜ二重間接参照を使うのか?またはなぜポインタへのポインタを使うのか?質問する

なぜ二重間接参照を使うのか?またはなぜポインタへのポインタを使うのか?質問する

C では二重間接参照はいつ使用すべきでしょうか? 誰か例を挙げて説明してもらえますか?

私が知っていることは、二重間接参照はポインターへのポインターであるということです。なぜポインターへのポインターが必要なのでしょうか?

ベストアンサー1

文字のリスト(単語)が必要な場合は、次のようにします。char *word

単語のリスト(文章)が必要な場合は、char **sentence

文章のリスト(独白)が必要な場合は、次のようにします。char ***monologue

独白のリスト(伝記)が必要な場合は、char ****biography

伝記のリスト(バイオライブラリ)が必要な場合は、char *****biolibrary

バイオライブラリのリスト(??笑)が必要な場合は、char ******lol

……

はい、これらは最良のデータ構造ではないかもしれないことはわかっています


非常に非常に非常に退屈な使用例(笑)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int wordsinsentence(char **x) {
    int w = 0;
    while (*x) {
        w += 1;
        x++;
    }
    return w;
}

int wordsinmono(char ***x) {
    int w = 0;
    while (*x) {
        w += wordsinsentence(*x);
        x++;
    }
    return w;
}

int wordsinbio(char ****x) {
    int w = 0;
    while (*x) {
        w += wordsinmono(*x);
        x++;
    }
    return w;
}

int wordsinlib(char *****x) {
    int w = 0;
    while (*x) {
        w += wordsinbio(*x);
        x++;
    }
    return w;
}

int wordsinlol(char ******x) {
    int w = 0;
    while (*x) {
        w += wordsinlib(*x);
        x++;
    }
    return w;
}

int main(void) {
    char *word;
    char **sentence;
    char ***monologue;
    char ****biography;
    char *****biolibrary;
    char ******lol;

    //fill data structure
    word = malloc(4 * sizeof *word); // assume it worked
    strcpy(word, "foo");

    sentence = malloc(4 * sizeof *sentence); // assume it worked
    sentence[0] = word;
    sentence[1] = word;
    sentence[2] = word;
    sentence[3] = NULL;

    monologue = malloc(4 * sizeof *monologue); // assume it worked
    monologue[0] = sentence;
    monologue[1] = sentence;
    monologue[2] = sentence;
    monologue[3] = NULL;

    biography = malloc(4 * sizeof *biography); // assume it worked
    biography[0] = monologue;
    biography[1] = monologue;
    biography[2] = monologue;
    biography[3] = NULL;

    biolibrary = malloc(4 * sizeof *biolibrary); // assume it worked
    biolibrary[0] = biography;
    biolibrary[1] = biography;
    biolibrary[2] = biography;
    biolibrary[3] = NULL;

    lol = malloc(4 * sizeof *lol); // assume it worked
    lol[0] = biolibrary;
    lol[1] = biolibrary;
    lol[2] = biolibrary;
    lol[3] = NULL;

    printf("total words in my lol: %d\n", wordsinlol(lol));

    free(lol);
    free(biolibrary);
    free(biography);
    free(monologue);
    free(sentence);
    free(word);
}

出力:

私の笑った言葉の総数: 243

おすすめ記事