1. ホーム
  2. c

[解決済み】なぜダブルインダイレクトを使うのか、なぜポインターをポインターにするのか?

2022-03-26 17:29:39

質問

C言語でダブルインダイレクトはどのような場合に使用するのでしょうか?どなたか例を挙げて説明してください。

私が知っているのは、ダブルインディレクションがポインタへのポインタであるということです。 なぜ、ポインタへのポインタが必要なのでしょうか?

どのように解決するのですか?

文字(単語)のリストを持たせたい場合は 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