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* 型になる

つまり、

scoreint
&scoreint*

このルールがあるため、
int* 型の変数にはそのまま代入できるのです。

* 演算子が正しく動く理由

*pScore

この式をコンパイラは、次のように解釈します。

pScore に入っているアドレスを使い、
そこから int 型 4バイト分を読み取る

void* 型のときに発生していた
「何バイト読むの?」という疑問が、
型情報によって完全に解消 されています。

型付きポインタの本質

ここまでの内容をまとめましょう。

項目内容
ポインタの正体アドレスを格納する変数
型付きとは指す先のデータ型を知っている。
利点* 演算子が安全に使える。
結果正しいサイズでメモリを読み取れる。

型付きポインタは、
アドレスとデータ型を結びつけるための仕組み
なのです。

次に進む前のひとこと

ここまで理解できれば、
ポインタはもう「怖い存在」ではありません。

次は、

  • ポインタを使って値を書き換える
  • 配列とポインタの深い関係

といった、
実戦的な使い方 に進んでいきましょう。

ここまで来たあなたは、
「ポインタを型で理解できる段階」 に到達しています。
次の記事で、いよいよポインタが真価を発揮します。