原点に戻って、ポインタとは?

平たく言うと、

メモリアドレスを指し示す変数のこと

メモリとは、

データの記憶装置。メモリアドレスを使って、保存データの場所を指示する

まず、準備。プロジェクト(memory_test)を作る。これまでの操作に加えて、セクションの定義を以下の様にする。

たとえば、

char str[] = "ABC";

int main()

{

    return 0;

}

とかしたとすると、メモリには以下の様に記憶される。

(メモリアドレスは、セクションの設定で決まる。初期値のあるグローバル変数は、Dセクションに配置される。初期値のないグローバル変数はBセクションに配置される。)

 0xFFE500  A
 0xFFE501  B
 0xFFE502  C
 0xFFE503  \0

     メモリアドレス

で、

char str[] = "ABC";

int main()

{

    printf("ADDRESS=%p\n", str);  // %pはポインタのアドレスを表示するオプション

    return 0;

}

とかして、このプログラムを実行すると、

変数は、コンパイラがセクションの設定からアドレスを計算して、メモリに割り当てる。

試しに、モニタのコマンドを使って、メモリの内容を表示してみるとどうなるか?

 teratermで、

 D FFE500[ENTER]  としてみるとメモリを表示できる。

また、

int array[] = {0x1200, 0x002, 0x3333, 0x45, 0x5678};
int main()
{
    return 0;
}

 とかして、プログラムを動かすと、メモリは、

 0xFFE500    array[0]  0x12  0x00
 0xFFE502    array[1]  0x00  0x02
 0xFFE504    array[2]  0x33  0x33
 0xFFE506    array[3]  0x00  0x45
 0xFFE508    array[4]  0x56  0x78
 0xFFE50A    array[5]  ????  ????

 

先程と同じように、モニタで確認してみよう。

ところで、メモリアドレスを直接指定してアクセスするにはどうしたらよいか?

やり方、その1 ポインタ(変数)を使う方法

int main()

{

    int   *i = (int *)0xFFE500;

    *i = 0x1234;

    printf(“%d\n”, *i);

    return 0;

}

やり方、その2 直接アドレス指定

#define MEMORY (*(volatile int *)0xFFE500)

int main()

{

    MEMORY = 0x5678;

 

    printf(“%d\n”, MEMORY);

    return 0;

}

以上のプログラムを実行して、モニタでメモリの状態を確認する。

最終更新:2014年11月10日 14:59