0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【C言語】メモリとアドレスとポインタ

Last updated at Posted at 2025-12-07

はじめに

この記事について

「C言語の基礎を学ぼう」をテーマに、自身の知識 + α をアドベントカレンダーにまとめます。
25日間でC言語をマスターしよう - Qiita Advent Calendar 2025 - Qiita

こんな方を対象としています

  • コンピュータがプログラムをどのように動かしているか知りたい/知らない方

  • プログラミングをしてみたい方

  • C言語初心者の方

キーワード

  • メモリ

  • アドレス

  • ポインタ

説明

メモリ

プログラム上で宣言された変数はメモリに格納されます。

C言語では、メモリを1バイト単位で利用するため、下記のようなイメージ図で表すことがあります。

1バイトごとのロッカーのようなイメージです。

メモリのイメージ

さて、変数宣言について考えるために下記プログラムを動かします。

sizeof はその変数がメモリ上で何バイト使用しているかを取得する演算子です。( sizeof は結果が size_t 型のため、 int 型にキャストして表示します)

#include <stdio.h>
int main(void) {
    int a;
    short b;
    printf("int size: %d\n", (int)sizeof(a));
    printf("short size: %d", (int)sizeof(b));
    return 0;
}
int size: 4
short size: 2

このときメモリは下記のような状態になっています(イメージ)。

変数宣言したメモリのイメージ

アドレス

メモリには場所を特定するための名前がついています。それを アドレス といいます。メモリの世界の住所です。

変数のアドレスを見てみましょう。変数 x のアドレスが知りたい場合、 &x と書きます。printfで表示させる場合は %pを使用します。

#include <stdio.h>
int main(void) {
    int a;
    short b;
    printf("a : %p\n", &a);
    printf("b : %p\n", &b);
    return 0;
}
a : 0000005BD97FF77C
b : 0000005BD97FF77A

ということは、メモリの状態は下記のような状態だった、ということになりますね。

変数のアドレスのイメージ

ポインタ

アドレスを入れるための変数があります。これを ポインタ変数 といいます。

ポインタ変数の宣言時には2つ気を付けることがあります。

  • ポインタ変数名の前に * を付ける

  • 「どの型の変数のアドレスを格納するか」を宣言時に決める

ポインタの宣言は下記のようになります。

int main(void) {
    int *a; // int型の変数のアドレスを格納するためのポインタ
    short *b; // short型の変数のアドレスを格納するためのポインタ
    return 0;
}

さて、ポインタを宣言できたので次はポインタを使ってみましょう。

ポインタは * を付けると、 メモリ上の「自身に格納されているアドレス」の場所の値 を返します。

プログラムで見てみましょう。

#include <stdio.h>
int main(void) {
    int a = 100;

    // int型の変数のアドレスを格納するためのポインタ
    int *p;
    
    // ポインタ変数pにaのアドレスを格納
    p = &a;

    // 「*p」でpに格納されているアドレスの場所を見る = aの値
    printf("%d", *p); 

    return 0;
}
100

* に2つの意味があると考えると理解しやすいです。

#include <stdio.h>
int main(void) {
    int a = 100;

    // この*は「ポインタですよ!」を表すための*
    int *p;

    p = &a;

    // この*は「格納されてるアドレスを見てね!」を表すための*
    printf("%d", *p); 

    return 0;
}

通常の変数は「実際の値」を持ち運ぶのに対して、ポインタは「ここにあるよ!」の情報を持ち運びます。

ざっくり例えると下記のような感じです。

  • 変数さん 「このアイスおいしそうでしょ!」(アイスを差し出す)
  • ポインタさん 「あのコンビニのアイスおいしそうだよね!」(場所を教える)

データの扱い方が違うだけですね。

練習

1. 変数を初期化しないとどうなる?

int型の変数を宣言し、初期化しない状態で値を出力してみよう。

ポイント

変数宣言 = メモリを確保するだけ、ということを実際に見てみます。

解答例

#include <stdio.h>
int main(void) {
    int a;
    printf("%d", a);
}
32758

確保したメモリの場所は他のプログラムが使った後かもしれません。結果は不定の値になります。C言語は変数宣言時に自動で初期化する仕組みは無いため、必ず初期化しましょう。

2. 他の変数の値を書き換えよう

int型の変数がある。その変数を直接書き換えることなく値を書き換えよう。

aは100です!
aは200です!

ポイント

ポインタを使用します。 * でアクセスして値を書き換えましょう。

解答例

#include <stdio.h>
int main(void) {
    int a = 100;
    int *p = &a;
    printf("aは%dです!\n", a);
    *p = 200;
    printf("aは%dです!\n", a);
}
aは100です!
aは200です!

おわりに

* で参照するときはワンクッション挟む感覚です。ある場所に行ったら次の場所が書いてあるメモが置いてあったみたいな感覚。

ポインタは難しいとよく聞きますが、一度感覚をつかめば読みやすいと思います。プログラムは書いた通りにしか動かないはずです。気分はコンパイラ。

参考文献

↓↓↓ はじめてプログラミングを学んだときに読んだ本です ↓↓↓
詳細(プログラミング入門 C言語)|プログラミング|情報|実教出版

0
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?