[解決済み】なぜダブルインダイレクトを使うのか、なぜポインターをポインターにするのか?
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
関連
-
[解決済み】malloc():メモリ破壊
-
[解決済み] SQLiteのINSERT/per-secondのパフォーマンスを向上させる
-
[解決済み] スマートポインターとは何ですか?
-
[解決済み] なぜ、オブジェクトそのものではなく、ポインタを使用しなければならないのですか?
-
[解決済み] 配列の場合、なぜ a[5] == 5[a] になるのでしょうか?
-
[解決済み] パラメータと戻り値におけるポインタと値の比較
-
[解決済み] リファレンスとポインタの使い分け
-
[解決済み] C言語でのポインタ:アンパサンドとアスタリスクはいつ使うのか?
-
[解決済み】高放射能環境下で使用するアプリケーションのコンパイルについて
-
[解決済み】C言語の関数ポインタはどのように機能するのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】ポインタへの代入時に互換性のないポインタ型からの初期化警告が発生した
-
[解決済み】エラー:イニシャライザー要素がロード時に計算可能でない
-
[解決済み】エラー。非スカラー型への変換を要求された
-
[解決済み】 「配列のイニシャライザーはイニシャライザーリストまたは文字列リテラルでなければなりません」と表示されるのですが?
-
[解決済み] [Solved] .Cファイルをコンパイルしています。アーキテクチャ x86_64 の未定義シンボル
-
[解決済み】エラー:不明な型名'bool'
-
[解決済み】int型配列へのポインタのスカラ・イニシャライザの過剰要素
-
[解決済み] テスト
-
[解決済み] リンクリストにノードを追加する際に、ダブルポインタを使用する理由は何ですか?
-
[解決済み] int argc, char *argv[] とはどういう意味ですか?