【6日でできるC言語入門】変数のアドレス

 C言語で本格的なプログラミングに進むには、メモリの仕組みを知ることが不可欠です。その中心となるのが「変数のアドレス」です。アドレスとは、メモリ上で値が保存されている“場所”を示す数字のこと。
 C言語では変数のアドレスを明示的に取得・利用できます。これを理解することで、ポインタや配列操作など高度なテクニックも自在に使いこなせるようになります。

1.変数のアドレスを取得する

1.1. サンプルプログラム

まず、さまざまな型の変数についてアドレスを表示してみましょう。

プロジェクト/ファイル名: Lesson49_1/main.c

#include <stdio.h>

int main(void) {
    int    x = 42;
    double y = 3.14;
    char   z = 'X';
    float  w = 8.5f;

    printf("xの値:%d, サイズ:%zuバイト, アドレス:%p\n", x, sizeof(x), (void*)&x);
    printf("yの値:%f, サイズ:%zuバイト, アドレス:%p\n", y, sizeof(y), (void*)&y);
    printf("zの値:%c, サイズ:%zuバイト, アドレス:%p\n", z, sizeof(z), (void*)&z);
    printf("wの値:%f, サイズ:%zuバイト, アドレス:%p\n", w, sizeof(w), (void*)&w);

    return 0;
}

実行例(アドレス値は実行環境ごとに異なります)

xの値:42, サイズ:4バイト, アドレス:000000F3E98FF6A4
yの値:3.140000, サイズ:8バイト, アドレス:000000F3E98FF6C8
zの値:X, サイズ:1バイト, アドレス:000000F3E98FF6E4
wの値:8.500000, サイズ:4バイト, アドレス:000000F3E98FF704

1.2. &演算子でアドレス取得

  • &変数名 で、その変数のアドレスを取得できます。
  • アドレスは通常、16進数表記で表示されます(%pを使うと安全です)。
  • 各変数はメモリの別々の場所に格納されているため、アドレスも異なります。

1.3.void* の意味と役割

void* は「汎用ポインタ型」

  • void*(ボイドポインタ)は「どんな型のデータも指せる特別なポインタ型」です。
  • たとえば int* は「int型のデータを指すポインタ」、double* は「double型のデータを指すポインタ」です。
  • それに対して void* は「型が決まっていないデータのアドレス」を扱えます。

printf%p を使う場合

  • printf 関数でアドレスを表示するには、書式指定子 %p を使います。
  • C言語の規格では「%p で表示する値は、void*型のポインタにキャストする必要がある」とされています。

具体例

cコピーする編集するint x = 10;
printf("%p\n", (void*)&x); // &xをvoid*にキャストしてから表示
  • &x は本来 int* 型(int型へのポインタ)ですが、(void*)&x としてvoid*型に変換しています。
  • これにより、どんな型の変数であってもアドレスを正しく安全に表示できるようになります。

なぜキャストするの?

  • C言語の規格で%pはvoid型のポインタのアドレスを表示するものと定められているためです。
  • 実際には &x のままでも表示できる場合が多いですが、標準的な書き方としては(void)にキャストするのが正しいです。

2.sizeof演算子の活用

2.1. sizeofで型や変数のサイズを調べる

用法説明
sizeof(int)int型が何バイトか調べる。sizeof(int) → 4
sizeof(変数名)その変数の型に応じたバイト数を返す。sizeof(x)
sizeof(double)double型のサイズsizeof(double) → 8

3.変数・型ごとのアドレスとサイズ

3.1. 表で理解しよう

変数サイズ (バイト)取得方法アドレス例
xint424&x0x7ffe4cda74a4
ydouble3.148&y0x7ffe4cda74b0
zchar'X'1&z0x7ffe4cda74a3
wfloat8.54&w0x7ffe4cda74a0

※アドレス値は実行ごとに異なります。

4.アドレスとポインタの基礎

4.1. アドレスは「場所の情報」

  • 変数のアドレスは「この変数はメモリ上のどこにあるか」を示します。
  • これを利用して、ポインタ変数の基礎につながっていきます。

まとめ

  • 変数のアドレス&変数名で取得できる。
  • アドレスは値ではなく、“場所”を示す特別な情報。
  • sizeof演算子で各変数のサイズも一緒に確認してみよう。
  • アドレスとメモリ操作が理解できれば、C言語の真髄にグッと近づきます!

アドレスを意識してコードを書くことは、C言語のプログラミング技術のステップアップに欠かせません。
次はポインタの使い方にも挑戦してみましょう!