ゾンビでもわかるC言語プログラミング

C言語入門者の応援をします

メモリとアドレス

Index

メモリとは

コンピュータには、メモリというものがあります。
メモリという言葉は、プログラミングに詳しくない人も聞いたことはあるのではないでしょうか。
このメモリは、プログラムを実行するときに使用され、プログラムで宣言した変数の値などは、一時的にこのメモリに格納されます。

よく32ビットパソコンや64ビットパソコンというのは、メモリ上で表現できるアドレスサイズのことを言います。
32ビット(4バイト)だと、表現できるアドレスサイズが以下になります。

0x0 ~ 0xffffffff  

64ビット(8バイト)だと以下になります。

0x0 ~ 0xffffffffffffffff

そして、それぞれに 1 バイト割り当てられるので、
32ビットだと、プログラムが使用するメモリサイズは0xffffffff(4294967296)バイトになります。

アドレスとは

メモリ上のある場所のことをアドレスといいます。
(英語表記だとaddressで日本語では住所という意味)

アドレスはよく16進数で表されます。

C言語で変数のアドレスを調べる

C言語で、変数のアドレスを調べるには、printf関数のフォーマット指定子に %p を記述し、変数の前に & をつけます。
この & をつけることによって、その変数は、格納している値の代わりに変数のアドレスを返します。

#include <stdio.h>

int main() {
    int a,b,c;

    printf("変数aは、メモリの %p バイト目にあります\n", &a);
    printf("変数bは、メモリの %p バイト目にあります\n", &b);
    printf("変数cは、メモリの %p バイト目にあります\n", &c);

    return 0;
}

出力

変数aは、メモリの 0x7fffc0c5d57c バイト目にあります
変数bは、メモリの 0x7fffc0c5d580 バイト目にあります
変数cは、メモリの 0x7fffc0c5d584 バイト目にあります

出力結果が16進数でわかりづらいので、これを10進数で表示してみましょう。
また、アドレスは、プログラムを実行するたびに変わります。

#include <stdio.h>

int main() {
    int a,b,c;

    printf("変数aは、メモリの %llu バイト目にあります\n", &a);
    printf("変数bは、メモリの %llu バイト目にあります\n", &b);
    printf("変数cは、メモリの %llu バイト目にあります\n", &c);

    return 0;
}

コンパイルしようとすると、警告が出るかもしれませんが、無視して実行しましょう。

変数aは、メモリの 140724659387484 バイト目にあります
変数bは、メモリの 140724659387488 バイト目にあります
変数cは、メモリの 140724659387492 バイト目にあります

アドレスの増加分を見ると、それぞれ 4 バイトづつ増加していることがわかります。
これは、int型が 4 バイトの領域を取るためです。

では、char型でも調べてみましょう。
char型は 1 バイトなので、アドレスが 1 バイトづつ増加するはずです。

#include <stdio.h>

int main() {
    char a,b,c;

    printf("変数aは、メモリの %llu バイト目にあります\n", &a);
    printf("変数bは、メモリの %llu バイト目にあります\n", &b);
    printf("変数cは、メモリの %llu バイト目にあります\n", &c);

    return 0;
}

出力結果は以下のようになります。

変数aは、メモリの 140727277378581 バイト目にあります
変数bは、メモリの 140727277378582 バイト目にあります
変数cは、メモリの 140727277378583 バイト目にあります

期待通りに 1 バイトづつ増えています。
これで、char 型は 1 バイトの領域を使用するということが確認できました。

書籍

新・明解C言語 入門編 (明解シリーズ)

新・明解C言語 入門編 (明解シリーズ)

苦しんで覚えるC言語

苦しんで覚えるC言語

やさしいC 第5版 (「やさしい」シリーズ)

やさしいC 第5版 (「やさしい」シリーズ)

C実践プログラミング 第3版

C実践プログラミング 第3版