コース一覧
    C言語基礎 ポインタ・構造体・ファイル
    アドレスとは

    C言語基礎 ポインタ・構造体・ファイル

    C言語のポインタ、構造体、ファイル操作を学び、データを扱う基礎を固めるコースです。

    1
    ポインタの入口
    01. アドレスとは15分
    02. ポインタの&と*15分
    03. scanfの&の正体15分
    04. 関数で値を書き換える15分
    05. 配列を関数に渡す15分
    06. つくる 入力処理の関数化15分
    07. 第7章クイズ10分
    2
    構造体とファイル
    01. 構造体15分
    02. メンバの読み書き15分
    03. 構造体配列15分
    04. 構造体と関数15分
    05. ファイルに書き込む15分
    06. ファイルを読み込む15分
    07. ファイルの失敗に備える15分
    08. つくる 保存機能15分
    09. 第8章クイズ10分
    3
    総合制作
    01. メニュー統合15分
    02. 自由拡張15分
    03. 完成と次のステップ10分

    アドレスとは

    変数はメモリのどこかに置かれている

    第2章から、点数を int score = 80; のように変数に入れてきました。ではその 80 は、どこにあるのでしょうか。答えはメモリです。プログラムを実行すると、コンピュータはメモリの中から int 1 個分の場所を確保して、そこに 80 を書き込みます。

    メモリは、番号の振られた巨大なロッカーの列だと考えてください。この番号のことを アドレス、日本語では番地と呼びます。変数名 score は、人間が読みやすいように付けた名札にすぎません。コンパイラはその名札を「何番地のロッカーか」に翻訳してから機械語を出しています。

    & で番地を取り出す

    変数の前に & を付けると、その変数が置かれている番地が取り出せます。この & を アドレス演算子 と呼びます。

    c

    int score = 80;
    printf("%p\n", (void *)&score);   // 番地が表示される

    %p は番地を表示するための書式指定子です。ただし、ここで出た数字を覚えても意味がありません。表示される番地は実行するたびに変わる からです。OS はプログラムを起動するたびに、その時点で空いている場所を割り当てます。同じプログラムを 2 回動かして違う数字が出ても、故障ではなく正常な動きです。

    この講座の課題でも、番地そのものを表示させることはしません。答え合わせのしようがないからです。

    大事なのは番地どうしの関係

    代わりに確かめられるのは、番地どうしの関係です。

    c

    int score1 = 80;
    int score2 = 80;
    
    if (&score1 != &score2) {
        printf("別の場所にあります\n");
    }

    score1 と score2 は値がどちらも 80 ですが、別々の変数なので必ず別の場所に置かれます。だから score1 を書き換えても score2 は巻き添えを食いません。当たり前に感じるこの性質は、2 つが違う番地を持っているからこそ成り立っています。

    番地は先頭のロッカー番号

    ロッカー 1 個は 1 バイト、つまり 8 ビット分です。int は多くの環境で 4 バイトなので、ロッカーを 4 個続けて使います。sizeof(int) と書けば、その環境で何バイトかを確かめられます。

    では &score はその 4 個のうちどれを指すのかというと、先頭 です。番地だけでは「そこから何バイトを、どう解釈して読むか」が決まらないので、番地と型の 2 つがそろって初めて値が読めます。この考え方が、次回のポインタでそのまま効いてきます。

    では、値が同じ 2 つの点数が別の場所に置かれていることを、プログラムで確かめてみましょう。

    要件

    1. score1 と score2 にどちらも 80 を入れる
    2. それぞれの値を 「score1の値は80点です」 の形で表示する
    3. & で取り出した番地を比べ、違うなら 「2つは別の番地にあります」 と表示する
    4. int が何バイトかを 「intは4バイトです」 の形で表示する

    ヒント

    番地の比較は if (&score1 != &score2) と書けます

    sizeof(int) の結果は %zu ではなく (int) にキャストして %d で出しても構いません

    生田 陸人
    監修生田 陸人
    ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
    編集 ゆめさく編集部·公開 2026/08/07

    関連レッスン

    • ポインタの&と*

      住所を入れておく変数を宣言して使えるようになります。

    • scanfの&の正体

      scanf に付けていた & の意味を説明できるようになります。

    • 関数で値を書き換える

      ポインタを引数にして、呼び出し元の変数を書き換えられるようになります。

    • 配列を関数に渡す

      配列を引数に取る関数を書けるようになります。

    このレッスンに出てくる用語

    意味があいまいなまま進んだ語は、ここから読み直せます。

    • 変数データに名前をつけて参照する仕組み
    • メモリプログラムとデータを一時保持する高速領域
    • 演算子//は切り捨て除算(7 // 2 = 3)。
    • ビット2進数の1桁。0 か 1 のどちらか
    main.c
    エディタを読み込んでいます

    メモ

    アドレスとは

    ⌘S で保存