++C++; // 未確認飛行 C

Google
Web ufcpp.net

メモリ

目次

キーワード

概要

C 言語のポインタや、C#・Java の参照型・参照渡しの仕組みを理解するためには、 コンピュータの中身、特に、メモリというものががどうなっているかを知る必要があります。

メモリとアドレス

コンピュータは概念的には下図のように、 加減乗除などの計算を行う ALU (arithmetic-logic unit: 要するに演算ユニット)と、 データを記憶しておくレジスタ、メインメモリからなります。 特に断りのない限り、 単に「メモリ(memory)」というとメインメモリのことをさします。

図1: コンピュータの中身の概念図

プログラムで使われるデータはメモリ上に記憶されます。 このメモリは、データを入れておく箱が並んでいるような構造になっていて、 箱の1つ1つには「アドレス(address)」と呼ばれる番号が付いています。

「アドレス」という言葉は、 下図のように、メモリ中のデータの入れ物1つ1つを住宅に例えて、 家の所在を表す番号=住所(address)という意味です。 新興住宅地のごとく、同じ形の家が大量に並んでいるような感じです。

図2: メモリを住宅地に例えてみる

メモリを住宅に例えるのが大げさだと思うなら、 例えば、コインロッカーのようなものをイメージすると良いと思います。

図3: メモリをコインロッカーに例えてみる

セレクタ

メモリというものは、「たくさんのマスがあって、各マスにアドレスが振られている」と説明しました。 ということは、マス(記憶素子)とアドレスに応じたマスを選ぶもの(セレクタ)があればメモリを作れることになります。

記憶素子の方は、電子回路の知識が必要になるのでここでは割愛。 DRAM とか SRAM という言葉で検索すれば説明が出てくると思うので、 興味があれば調べてみてください。

で、セレクタの方ですが、 例えば、2ビットのセレクタは以下に説明するような論理回路で作ることが可能です。 まず、i をアドレスとします。 2ビットセレクタなので、「0 ならば a という値を、1 ならば b という値を選択」というように、i は 0, 1 の1ビット信号になります。 この「0 ならば a、1 ならば b」というのは、 以下の論理式で表す事ができます。

ia + i b

(ただし、本節では、論理積(AND)を ab で、 論理和(OR)を a + b で表します。)

4ビットのセレクタの場合、 アドレス i(0~3 の4値)は、2ビットの2進数で表すことができて、 その1ビット目を i1 、 2ビット目を i2 とします。 そうすると、 「i が 0 ならば a、 1 ならば b、 2 ならば c、 3 ならば d」 となるような論理式は以下のようになります。

i1 i2 a + i1 i2 b + i1 i2 c + i1 i2 d

この調子で、可能なアドレス i の範囲をどんどん大きくしていけばメモリができあがります。

ポインタ

メモリのアドレスを記憶しておくための変数のことをポインタ(pointer: アドレスを“指し示す”変数という意味)と呼びます。 ここでは、C 言語を用いてポインタの説明をします。 C 言語では、変数宣言時に * を付けるとポインタ型の変数になります。

char *a; // char 型のポインタ
char b;

上述の例では、 char型のポインタ変数 a と、 char型の値を保持する変数 b が宣言されています。 下図に示すように、ポインタ変数も通常の変数もメモリ上に値が記憶されることには変わりありません。 (この図は一例。 とりあえず、今回は、 a がアドレス100の位置に、 b がアドレス105の位置に格納される物として話を進めます。 )

図4: 変数 a と b

また、変数の前に & を付けると、変数のアドレスを取得することが出来ます。

a = &b; // 変数 b のアドレスを a に代入。

上の例の用のコードを書くと、ポインタ変数 a に変数 b のアドレスが記憶されます。 イメージ的には下図のようになります。

図5: ポインタ変数 a の中身

一方、ポインタ変数の前に * を付けると、 ポインタ変数の指し示すアドレスの先を読み書きすることが出来ます。

*a = 213; // ポインタ a の指し示す先の値を変更。

上の例のようなコードを書くと、 変数 a の中身ではなく、 a の指し示す先(この例では b)の中身が書き換わります。 イメージ的には下図のようになります。

図6: ポインタ変数 a の指し示す先

このような、ポインタを介した値の読み書きを間接参照(indirect reference)といいます。

Transtation into English

[お問い合わせ](q)