とても良い質問です。
高級言語(C, Java, Pythonなど)は、アドレス指定方式そのものを意識せずに書けるように設計されていますが、
コンパイルや実行時には内部で適切なアドレス指定方式が使われています。
ここでは「高級言語が内部でどのようなアドレス指定方式に対応しているのか」「どう使い分けられているのか」を分かりやすく解説します。
✅ 前提:アドレス指定方式と高級言語の関係
✅ 高級言語とアドレス指定方式の対応表
| 高級言語の記述 | 実際に使われるアドレス指定方式(例) | 説明 |
|---|
x = 5 | 即値アドレッシング | 定数5を直接代入(命令に値が含まれる) |
x = y | 直接 or レジスタアドレッシング | yのメモリまたはレジスタから読み込み |
x = *p(C言語) | 間接アドレッシング | ポインタpが指すアドレスから取得 |
x = a[i] | インデックスアドレッシング | aのベース+インデックス値で取得 |
x = struct.member | ベース+オフセット | 構造体のベース+固定のオフセット |
✅ 高級言語別の傾向
【C / C++】
アドレス操作ができる代表的な言語
&, *, [], struct などで各方式を明示的に利用可能
ポインタの存在により、間接アドレッシングを明示的に書ける
例:
int a[10]; // 配列(インデックス方式)int *p = &a[0]; // ポインタ(間接方式)int x = *p; // pが指すアドレスの値(間接)
【Java】
例:
int[] a = new int[5];a[1] = 10; // インデックス方式に対応
【Python】
例:
a = [1, 2, 3]x = a[1] # インデックス
✅ 使い分けの観点
| シーン | 使われる方式 | 説明 |
|---|
| 定数の代入 | 即値アドレッシング | 例:x = 10 |
| 単なる変数コピー | レジスタや直接 | 例:x = y |
| 配列・リストアクセス | インデックス or ベース+オフセット | 例:x = arr[i] |
| ポインタ操作 | 間接アドレッシング | 例:x = *p(C) |
| 関数のジャンプや分岐 | 相対アドレッシング | if文や関数呼び出しで使われる |
✅ 補足:実際の選択は誰がしている?
例:
x = y + 3;
レジスタにyを読み込み(レジスタアドレッシング)
3を即値で指定(即値アドレッシング)
結果をxに保存
✅ まとめ
| 高級言語での構文 | 内部で使われるアドレス指定方式 |
|---|
x = 5 | 即値 |
x = y | 直接 / レジスタ |
x = *p | 間接 |
x = a[i] | インデックス |
x = s.member | ベース+オフセット |
なぜ使い分けるのか?
→ 処理速度、柔軟性、メモリ効率、構造体や配列操作など用途に応じて最適化するため。
この記事へのコメント