コンピュータの中で数値や文字列やプログラムそのものを記憶するための ものをメモリという。コンピュータのメモリは、一般的に RAMである。RAMとは Random Access Memory の略で、好きなところに 好きな内容(数値)を自由に読み書きできるメモリを意味する。RAMとは対照的に 読み込みしかできないものと してROMがある(Read Only Memory)。ROMは一度何かのデータを書いた ら書き換えることができない。RAMは一度電源を切ると内容が消えてしまう(消え ないRAMもある)が、ROMは電源を切っても消えない。コンピュータの電源を入れ てからシステムが起動するのに必要な情報はROMにたくわえられる。
コンピュータが実際に計算したりデータを処理したりするときに利用する メモリを、主記憶という。これとは別に、すぐには使わなくて良い データをたくさんたくわえておくメモリを補助記憶という。 現在の一般的なコンピュータでは主記憶としてRAMを使い、補助記憶として ハードディスクドライブ(HDD)を使う。
メモリの大きさを計る尺度を覚えておこう。
2進数一桁ぶん(1か0か)。情報量、2
2進数8桁ぶん。情報量 2の8乗=256。厳密には8ビットのことを オクテットという。
1024のことを大文字Kであらわす。小文字kは1000。大文字Kは1024。 小文字kと区別するときは「キロ」ではなく「ケイ」と読むこともある。 1KB=1024バイト。
1024の1024倍のことをM(メガ)という。
1MB=1024x1024バイト=1048576バイト
1メガの1024倍のことを1G(ギガ)という。
1GB=1024^3=1073741824バイト(約10億)。
1ギガの1024倍のことをT(テラ)という。
1TB=1024^3=1099511627776バイト(約1兆)。
家庭用PCでは、メモリが512MB程度、HDDが80〜500GB程度のものが一般的(2008年)。 101/102教室のワークステーションはメモリ32GB、HDD約2TB。
メモリは、もの(値)をしまうためのものであるから、何をどこにしまったか があとで分かるようにしなければならない。メモリの中にしまう場所がたくさん あるが、それが何番目の場所なのかを表すものをアドレスという。
普及しているコンピュータのメモリは、1バイト(8ビット)のデータを
入れる箱がいくつもあり、先頭が0番地、その次が1番地、次が2番地…と
全ての箱にアドレス(番地)が付いている。番地の番号は通常16進数で表す。
16進数は先頭に 0x
を付けて表す。
例:
0x10
== 16進数の10 == 10進数の16
メモリにデータが格納される様子をイメージすると下図のようになる。
番地 値 0000 05 0001 03 0002 2c 0003 04 : : 1000 3d 1001 4c : : fffe 8a ffff c3
コンピュータが登場した頃は、プログラミングの時にメモリのどの番地にど んなデータをしまうかは人間が把握・管理していたが、C言語のようなプログラ ミング言語を利用できる現在ではそのようなことは人間は考えなくて良い。 たとえば、C言語で
int x = 4;
と書くと、システムが勝手にコンピュータの中の空いているアドレスを割り
当てて x
という変数用に使わせてくれる。101教室(Solarisとgcc
を利用した環境)の場合、int
と書くと4バイト(32ビット)ぶんの
メモリを割り当ててくれる。
番地 変数 値 : : : 4000 [x] 00 4001 00 4002 00 4003 04 : : :
この例では、変数x
が格納されるのがコンピュータのメモリの
0x4000番地になっているが、実際にはそれが何番地になるかをプログラミングの
時に走らなくても良い。また、場合によっては x=4
のときには、
以下のように格納されるコンピュータもある。
番地 変数 値 : : : 4000 [x] 04 4001 00 4002 00 4003 00 : : :
前者のように(16進数で)大きな位から値が格納されるものを ビッグエンディアンという。後者のように小さな位から 値が格納されるものをリトルエンディアンという。Sunは ビッグエンディアンだが、WindowsむけPC(Intel系列PC)はリトルエンディアンで ある。ほとんどの場合どちらかは知らなくても良いが、ネットワークプログラミ ングなど、より進んだプログラムを書くときには知っておく必要がある。
人間はプログラムを書くときに、原則として変数が格納される具体的な アドレスを知る必要はない。しかし、C言語は人間様に歩み寄った賢いものでは ないので、現実的にはC言語プログラムの中で変数のアドレスをコンピュータに 教えてやる必要がある。
これこれ、そこの人間。わしが集めて来たデータを、そちのメモリに 格納してしんぜよう。めぐんでやるから、アドレスを教えなさい。どこじゃ? 0x4000番地か? 0x8234番地か? 早く申すが良い。
ははあー、ありがたき幸せ、では x
という変数に…
たわけものッ!
x
はどこじゃ? どのアドレスにあるのじゃ?
わしに調べろというのか? はっきりと
アドレスを言えと申したではないか!
たいへん失礼つかまつりました…。アドレスは……、アドレスは…
というように、変数のアドレスをコンピュータに教えなければならないこと
がある。このようなときは変数名に &
を付けると
その変数の格納アドレスという意味になる。
たいへん失礼つかまつりました…。アドレスは……、アドレスは…、
はい、&x
でお願いつかまつります。
ある変数のアドレスを表すには変数名の直前に &
を付ける。
int x = 5; /* int型変数xを宣言。値は5 */ x; /* xそのままでは変数の持つ値、つまり5 */ &x; /* xのアドレス。値は…時と場合によって異なる */
次のプログラム address.c
を
作成し、コンパイル&実行してみよう。
#include <stdio.h> int main() { int x = 5; printf("xのアドレスは %p\n", &x); }
&x
がどのような値になるかは事前には全く分からないし
知る必要もない。