★メモリアドレスについて★


コンピュータには主記憶装置(メインメモリ)があり、プログラムを実行する時にプログラム本体やデータはメインメモリに配置されます。

配置されたプログラムやデータを中央処理装置(CPU)が取り出して実行しているのです。

その時に、プログラムやデータの場所を表すのが番地(アドレス)です。

現実の世界でも住所があるからこそ家が特定でき、郵便物などが届くと考えると分かりやすいかもしれません。

メモリ内の番地は1バイトごとに0からの連番で割り振られています。

変数や配列などもメモリ内に配置され、プログラムから確認することが出来ます。

変数を1つ作って番地を見てみましょう。

<sample program col031-01>

#include <stdio.h>

int main(void)
{
    int a;

    printf("%d\n", &a);

    return 0;
}

<実行結果>

3930636
続行するには何かキーを押してください・・・

※実行結果は毎回変わる可能性があります。


変数の番地を表示するには、変数名の前に「&」を付ければOKです。

scanf関数を使うときに「&」を付けていたと思いますが、あれも番地を表しています。

上のプログラムの場合、変数aは3930636番地に配置されていたということです。


printf関数で番地を表示する時に使う書式がありますので、それに変えてみましょう。

<sample program col031-02>

#include <stdio.h>

int main(void)
{
    int a;

    printf("%p\n", &a);

    return 0;
}

<実行結果>

00E7F9A0
続行するには何かキーを押してください・・・

※実行結果は毎回変わる可能性があります。


「%p」は番地を表示するための書式で、16進数で表示されます。

(使いやすい方を使ってください)


次に配列の番地を見てみます。

要素数が3つの配列を用意して、それぞれの番地を確認します。

<sample program col031-03>

#include <stdio.h>

#define DATA 3

int main(void)
{
    char data[DATA];

    int i;

    for (i = 0; i < DATA; i++){
        printf("data[%d] = %p\n", i, &data[i]);
    }

    return 0;
}

<実行結果>

data[0] = 0104FAA0
data[1] = 0104FAA1
data[2] = 0104FAA2
続行するには何かキーを押してください・・・

※実行結果は毎回変わる可能性があります。


char型のサイズは1バイトです。

番地は1バイトごとに割り振られていますので、連続した3つのメモリが割り当てられていることが分かります。


型を変えてみましょう。

<sample program col031-04>

#include <stdio.h>

#define DATA 3

int main(void)
{
    short data[DATA];

    int i;

    for (i = 0; i < DATA; i++){
        printf("data[%d] = %p\n", i, &data[i]);
    }

    return 0;
}

<実行結果>

data[0] = 010BF990
data[1] = 010BF992
data[2] = 010BF994
続行するには何かキーを押してください・・・

※実行結果は毎回変わる可能性があります。


short型のサイズは2バイトです。

番地は1バイトごとに割り振られていますので、1つ飛ばしで番地が割り振られています。

data[0]のデータは、010BF990番地と010BF991番地の2つにまたがって入っているということです。


配列については、配列の先頭要素の番地を良く使います。

&data[0]

と書くと先頭の番地を指すのですが、通例は

data

と配列名のみ書きます。


実際に見てみましょう。

<sample program col031-05>

#include <stdio.h>

#define DATA 3

int main(void)
{
    short data[DATA];

    printf("&data[0] = %p\n", &data[0]);

    printf("data = %p\n", data);

    return 0;
}

<実行結果>

&data[0] = 007CFBC4
data = 007CFBC4
続行するには何かキーを押してください・・・

※実行結果は毎回変わる可能性があります。


同じ番地が表示されました。


最後に、プログラム自体もメモリ内にありますので番地を見ることが出来ます。

<sample program col031-06>

#include <stdio.h>

int main(void)
{
    printf("main = %p\n", main);

    return 0;
}

<実行結果>

main = 0124113B
続行するには何かキーを押してください・・・

※実行結果は毎回変わる可能性があります。


番地は毎回変わる可能性があるため、番地の数値自体に今のところ意味はありません。

メモリにどのように配置されているかイメージし、変数や配列の番地を取得する方法が分かれば良いと思います。


ブラウザの戻るボタンで戻ってください。