メモリとは?



メモリとは、コンピュータの中で記憶を担当する電子部品です。

メモリの写真を載せておきます。
 

この中に数値や文字や命令を記憶するわけです。
この容量は想像以上にものすごく多くて、最近のパソコンには新聞換算2か月分以上の文字情報を蓄えるだけのメモリが備わっています。

メモリに蓄えられた情報を引き出すにはメモリ上の欲しい情報のある場所を特定する必要があります。

場所とは住所のようなものです。本では「○○ページの△行目」といったように場所を特定できます。
メモリの場合は1番地から順番に数億(以上)番地まで存在します。

一つの番地(つまり1バイト)に蓄えられる情報はアルファベットで1文字、正の整数値だと0〜255までの値です。

プログラムを動かすとき、コンピュータはそのプログラムに対してある程度のメモリのスペースを貸し出します。
この領域範囲内のメモリはプログラムが自由に使うことが出来ます。
プログラムが変数を使いたいとき、自分のメモリ領域の中から一部を切り出してその変数の領域とします。
その領域が変数の値を収めるスペースとなります。

「特殊なプログラムを組む」という時以外はメモリに付けられている番地をプログラマーが知る必要はありません。
この番地の管理、移動、計算、記憶等は全てコンピュータに任せる仕事です。
しかし、この「アドレス」という概念を利用して効率的なプログラミングが出来ることが多々あります。

普通の変数はメモリ上の自分の変数が存在する場所以外には立ち入ることが出来ません。
つまり、自分の変数の存在する番地のお隣さんの番地のデータを覗き見たりすることが出来ません。

char a;   (1バイト)
int b;    (4バイト)

例えば以上のような変数を宣言したとします。すると、変数にはメモリ上の次の表のような番地が割り当てられました(あくまで仮定です)。
 
番地(番地一つで1バイト) 変数 変数aが見える範囲 変数bが見える範囲 ポインタが見える範囲
4251500 a      
4251501 空き      
4251502 空き      
4251503 空き      
4251504 b      
4251505 b      
4251506 b      
4251507 b      
4251508 空き      
4251509 空き      

見てもらえば分かるとおり、変数a,bは共に自分の範囲以外に立ち入ることは出来ません。しかし、ポインタは自由なのです。
新聞で例えれば、自分の記事の載った切り抜きしか渡されない通常の変数と、新聞を丸々渡されるポインタ変数のような違いがあります。
メモリ上好きな番地のデータを自由に閲覧したり書き込んだり出来る存在、それがポインタという概念なのです。

また、C言語では変数へのメモリの番地の割り当て方にルールがあります。



ルール

構造体や配列の場合、連続したアドレスがその変数に割り当てられる


このルールがポインタが活躍する大きな要因となっています。
連続しているということは、メモリ上に飛び飛びに同一配列&構造体が存在することは無いということです。

配列

char data[100]; (合計100バイト)

とすると、例えば連続して32000000〜32000100番地が割り当てられるといった感じです。

万能ですが、少し恐い点もあります。例えば上の表で4251502番地をポインタに設定してしまうと、どの変数にも割り当てられていないメモリ領域を指し示すことになってしまいます。この領域にデータを読み書きした時点で最悪パソコンが止まってしまいます(メモリ一般保護違反などというメッセージが表示されて)。よって、ポインタを扱うときは慎重に扱うことが肝心です。