ポインタからポインタへのポインタと通常のポインタとの比較
質問
ポインタの目的は、特定の変数のアドレスを保存することです。その場合、次のコードのメモリ構造は次のようになります。
int a = 5;
int *b = &a;
メモリアドレス ..................値
a ... 0x000002 ................... 5
b ...... 0x000010 ....... 5
なるほど、結構です。では、今度はポインタ*bのアドレスを保存したいと仮定します。そうすると、一般にダブルポインタ **c を次のように定義します。
int a = 5;
int *b = &a;
int **c = &b;
すると、メモリ構造は次のようになります。
......メモリアドレス ......値
a ... 0x000002 ................... 5
b ...... 0x000010 ....... 5
c ... 0x000020 ................... 0x000010
つまり、**cは*bのアドレスを参照しています。
さて、私の疑問は、なぜこのようなコードになるのか、ということです。
int a = 5;
int *b = &a;
int *c = &b;
警告を発生させるか?
ポインタの目的が単にメモリアドレスを保存することであれば、保存しようとするアドレスが変数、ポインタ、ダブルポインタなどを指していれば階層はないはずなので、以下のようなコードは有効だと思います。
int a = 5;
int *b = &a;
int *c = &b;
int *d = &c;
int *e = &d;
int *f = &e;
どのように解決するのですか?
で
int a = 5;
int *b = &a;
int *c = &b;
警告が表示されるのは
&b
は型が
int **
型の変数を初期化しようとすると
int *
. これら2つの型の間には暗黙の変換がないため、警告が発生します。
もっと長い例を考えてみましょう。
f
を参照しようとすると、コンパイラは
int
を与えるだけで、それ以上参照できないポインタです。
また、多くのシステムで
int
と
int*
は同じサイズではありません(例えば、ポインタは64ビット長で
int
は32ビット長である)。もし,非参照の
f
を参照し
int
を取得すると、値の半分を失い、さらにそれを有効なポインタにキャストすることもできません。
関連
-
Solve Dev-c++ [エラー] 'for' ループの初期宣言は、C99 または C11 モードでのみ許可されます。
-
[解決済み] C言語で%sを正しく使う - 超基本レベル
-
[解決済み] Windows用Cコンパイラ?[クローズド]
-
[解決済み] C言語の**はどういう意味ですか?
-
[解決済み] SQLiteのINSERT/per-secondのパフォーマンスを向上させる
-
[解決済み] C言語でのブーリアン値の使用
-
[解決済み] C 言語の配列へのポインタ/ポインタの配列の曖昧さ解消
-
[解決済み】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 実装 サイバーパンク風ボタン
おすすめ
-
赤線の位置は必ずしも間違っていない:式は変更可能なlvalueでなければならないエラーは、この文とは別の場所に存在する可能性があります。
-
VSCodeでCプログラムを書くとエラーになる:ソースファイル "stdio.h" を開くことができない
-
未定義の `__isoc99_sscanf' への参照
-
[解決済み] 初期化でポインタ対象の型から修飾語を捨てる
-
[解決済み] C言語で%sを正しく使う - 超基本レベル
-
[解決済み] C言語で関数型プログラミングを行うためのツールにはどのようなものがありますか?
-
[解決済み] mallocの結果はキャストするのですか?
-
[解決済み] C言語における「static」の意味とは?
-
[解決済み] mallocとcallocの違い?
-
[解決済み] C言語でのブーリアン値の使用