
C言語入門|型付きポインタのしくみ
ポインタが「正しく値を読む」ための秘密
前の記事では、アドレスを使ってメモリの中身を取り出す方法を学びましたね。
ただし、void* 型では どのデータ型であるのかが分からす、コンパイルエラーになる、という問題も確認しました。
アドレスは分かるけど、
何バイト読めばいいのか分からない
この問題を解決するのが、今回学ぶ 型付きポインタ です。

型付きポインタとは何か
void* 型に代わって実際のプログラムで使われるのが、
int* や short*、double* などの 型名 + * の形をしたポインタ型 です。
| ポインタ型 | 意味 |
|---|---|
| int* | int 型の変数の先頭アドレス |
| short* | short 型の変数の先頭アドレス |
| double* | double 型の変数の先頭アドレス |
見た目は int 型の仲間のようですが、
中身はあくまでアドレス であり、意味のある数値を直接入れる型ではありません。
void* 型と int* 型の違い
ここで、一度整理しておきましょう。
ポインタ型の比較
| 項目 | void* 型 | int* 型 |
|---|---|---|
| 格納できるもの | アドレス | アドレス |
| 指す先の型情報 | 持たない | int 型 |
| * 演算子 | 使用不可 | 使用可能 |
| 読み取るサイズ | 不明 | 4バイト |
この 「型情報を持っているかどうか」 が決定的な違いです。
int* 型が持つ「意味」と「効果」
int* 型のポインタには、次の2つの重要な役割があります。
意味
このアドレスは、
int 型(4バイト)のデータの先頭を指している
効果
- 演算子を使うと、
先頭アドレスから 4バイト分を取り出す
つまり、
どこから・どこまで読むかをコンパイラに正確に伝えている
というわけです。
型付きポインタを使ったサンプルプログラム
それでは、void* 型を使っていたプログラムを、
int 型を使う形に書き換えた例* を見てみましょう。
プロジェクト名:9-8-1 ソースファイル名: sample9-8-1.c
#include <stdio.h>
int main(void)
{
int score = 92;
printf("テストの得点は %d 点です。\n", score);
int* pScore = &score;
printf("score のアドレスは %p です。\n", pScore);
printf("%p 番地の中身は %d です。\n", pScore, *pScore);
return 0;
}プログラムの動きをメモリで考える
このプログラムで行われていることを、順番に見てみましょう。
① 変数の生成
int score = 92;| 内容 | 説明 |
|---|---|
| 確保サイズ | 4バイト |
| 保存される値 | 92 |
仮に、score が 5000 番地から配置されたとします。
② 型付きポインタへの代入
int* pScore = &score;この1行で起きていることは次のとおりです。
| 手順 | 内容 |
|---|---|
| ➀ | score の先頭アドレスを取得 |
| ➁ | pScore をメモリに確保 |
| ➂ | score の番地を pScore に代入 |
重要なポイント
- &score の結果は int 型*
- 型が一致しているため、キャストは不要
なぜキャストを書かなくていいのか
ここで、よくある疑問が出てきます。
&score って、
本当は (int*)&score って書くべきじゃないの?
実は、書く必要はありません。
C言語のルール
X 型の変数に & を付けると、結果は X* 型になる
つまり、
| 式 | 型 |
|---|---|
| score | int |
| &score | int* |
このルールがあるため、
int* 型の変数にはそのまま代入できるのです。
* 演算子が正しく動く理由
*pScoreこの式をコンパイラは、次のように解釈します。
pScore に入っているアドレスを使い、
そこから int 型 4バイト分を読み取る
void* 型のときに発生していた
「何バイト読むの?」という疑問が、
型情報によって完全に解消 されています。
型付きポインタの本質
ここまでの内容をまとめましょう。
| 項目 | 内容 |
|---|---|
| ポインタの正体 | アドレスを格納する変数 |
| 型付きとは | 指す先のデータ型を知っている。 |
| 利点 | * 演算子が安全に使える。 |
| 結果 | 正しいサイズでメモリを読み取れる。 |
型付きポインタは、
アドレスとデータ型を結びつけるための仕組み
なのです。
次に進む前のひとこと
ここまで理解できれば、
ポインタはもう「怖い存在」ではありません。
次は、
- ポインタを使って値を書き換える
- 配列とポインタの深い関係
といった、
実戦的な使い方 に進んでいきましょう。
ここまで来たあなたは、
「ポインタを型で理解できる段階」 に到達しています。
次の記事で、いよいよポインタが真価を発揮します。
