C言語入門|間接演算子の本当の力

メモリ上に「変数を生み出す」魔法

やった!
さっきの型付きポインタのコード、ちゃんと動きましたね。

ここまで来たあなたは、
「ポインタはアドレスを扱うための型」
というところまでは、もうしっかり理解できています。

では次の一歩です。
今回の主役は、あの記号― *(アスタリスク)

なぜ C 言語は「王」と呼ばれるのか

C 言語が特別視される理由は、とてもシンプルです。

特徴内容
高水準変数・関数・制御構文が使いやすい。
低水準メモリやCPUを直接扱える。

多くの高級言語では、
メモリの番地そのものを意識して操作することはできません

なぜなら、

  • 変数の配置場所は OS が管理する。
  • 開発者が勝手に番地を指定できない。

という安全設計になっているからです。

もし「好きな番地」を使えたら?

ここで、ちょっと想像してみてください。

もし私たちが
メモリ上の好きな番地を
変数として扱えたら……?

  • 任意の場所を読み取れる。
  • 任意の場所に書き込める。

……ちょっと怖いですが、
C 言語では、それができてしまいます

その鍵を握るのが、
今回のテーマである 間接演算子 です。

間接演算子(*)の書式と役割

まずは基本の形から整理しましょう。

書式

*ポインタ変数

何をする演算子か

項目内容
入力ポインタに格納されたアドレス
動作その番地を先頭とする領域を読み書き
結果その型の変数に「化ける」

ここが最大のポイントです。

間接演算子の本当の働き

*演算子は、単に値を取り出す演算子ではありません。

本質的な役割

指定されたアドレス範囲を巻き込み、
その場で「仮想的な変数」を生み出し、
それに化ける

つまり、

  • 変数が事前に宣言されていなくても
  • メモリ上にあれば
  • その場で変数として扱える

という、ものすごい力を持っています。

型付きポインタと組み合わさったときの力

たとえば、次のような状況を考えてみましょう。

ポインタの中身
1000int*

このとき、
int* 型変数 x に 1000 が格納されているとき

*x

と書くと、

  • 1000〜1003 番地を
  • int 型の変数として扱う

ことになります。

実在するかのような int 変数が、その場で誕生する
─これが、間接演算子の正体です。

極端な例で見る「王の力」

次は、理解を深めるための 極端な例 です。
※ 絶対に実行してはいけません。

// メモリ 0〜3 番地を int 変数として読む
int* p = 0;
printf("%d\n", *p);

// メモリ 9000〜9001 番地を short 変数として書き換える
short* q = 9000;
*q = 500;

このコードが意味することを、表で整理しましょう。

意味
int* p = 00番地を先頭とする int 変数を指す。
*p0〜3番地を読む。
short* q = 90009000番地を先頭とする short 変数
*q = 5009000〜9001番地を書き換える。

つまり、
メモリ空間のどこでも、変数を生み出せる
ということです。

なぜ危険なのか

この力が危険な理由は、次の点にあります。

理由内容
保護を無視OSが守っている領域も触れる。
影響範囲が不明どこを壊すか分からない。
即クラッシュプログラムやOSが停止する。

だからこそ、
この力は 厳重に理解したうえでのみ使うべきもの なのです。

もう一度、基本の例に戻ってみよう

では、安全な例に戻りましょう。

int value = 40;
int* pValue = &value;
*pValue = 75;

このとき起きていることは、実はとても単純です。

表現実体
valueある番地を先頭とする int 変数
*pValue同じ番地を先頭とする int 変数

つまり、*pValue は

value = 75;

と書くのと、完全に同じ意味 になります。

*pValue は value の「別名」にすぎない

ここはとても大切なので、はっきり言います。

*pValue とは、
あるメモリ領域に付けられた
「もう一つの名前」

名前が違うだけで、
指している実体は同じ なのです。

理解が追いつかなくて当然

この感覚は、最初は誰でも混乱します。

  • 変数が消えた気がする。
  • 勝手に生まれた気がする。
  • どこを触っているか分からない。

でも大丈夫です。

車の運転と同じで、

  • 目で確認
  • 手順を追う
  • 何度も書く

これを繰り返すうちに、
自然と「見える」ようになります。

ここまで理解できたあなたは、
「ポインタで値を読む人」から
「ポインタで世界を書き換えられる人」

への入口に立っています。

次はいよいよ、
この力を 安全に使いこなす方法 に進みましょう。