メモリとアドレスについて
最終更新日:2004-06-12.
今回は、メモリとアドレスについてちょっと。
ソフトを起動する、プログラムを実行すると
それはメモリ上に読み込まれます。
そのとき使用する変数や大切なデータなども
専用の領域に確保され、読み込まれます。
・メモリ
変数を使用するために、データ型と変数名を宣言します。
これにより、メモリのどこかに指定したデータ型のサイズで
任意の名前の変数が確保されます。
このメモリは、ビットの集まりです。
ビットは、0または1の情報を表現できます。
そして、8ビットをひとまとめとしてアドレス(番地)が割りふられて
管理されています。
この8ビットは1バイトです。
1バイトは、2進数で表現すると00000000から11111111までの
256通りの情報を表現できます。
この中に半角の英数字、カナ、記号、制御コード、漢字コードなどが
割り当てられていて、アスキーコード表を参照することで詳細が分かります。
int i;
これで、メモリのどこかにint型の変数iが確保されました。
i=123;
これにより、変数iに123が代入されました。
この変数iがメモリ上のどこにあるのか、
そのアドレスを調べる方法は「&」を使います。
&i
そして、メモリのアドレスを保存しておく変数として、
ポインタがあります。
int *p;
ポインタ変数は上記のように「*」を使って
宣言します。
p=&i;
上記のようにすると、int型変数iのアドレスを
ポインタpに記憶しておくことができます。
また、
*p
によってポインタ変数pが記憶している変数iの値を
参照できます。
いろいろなデータを処理する際、変数に代入した値だけでなく、
その変数のアドレスも記憶しておくといろいろと利用できます。
例えば、1行分のデータとか1ページ分のデータを
メモリに読み込みます。
そして、そのデータの中から探したい文字列を検索するとします。
もし、検索がヒットすればその文字列が読み込まれている
メモリのアドレスが返されます。
では、それらをソースで見てみましょう。
+------------------------------------------------------------+
/* filename=no007-1.c */
/* include */
#include <stdio.h>
/* main */
int main( )
{
/* 変数の宣言と値の代入 */
char c='A';
int i=12345;
short j=23456;
long l=98765;
float f=3.14;
double d=99.99;
char word[10]="JAPAN";
/* 値とアドレスを表示 */
printf("c=%c, ADDRESS=%d\n", c, &c);
printf("i=%d, ADDRESS=%d\n", i, &i);
printf("j=%d, ADDRESS=%d\n", j, &j);
printf("l=%ld, ADDRESS=%d\n", l, &l);
printf("f=%f, ADDRESS=%d\n", f, &f);
printf("d=%f, ADDRESS=%d\n", d, &d);
printf("word=%s, ADDRESS=%d\n", word, &word[0]);
return 0;/* 終了 */
}
+------------------------------------------------------------+
上記のソースをコンパイルして実行すると以下のように表示されました。
c=A, ADDRESS=4041
i=12345, ADDRESS=4039
j=23456, ADDRESS=4037
l=98765, ADDRESS=4033
f=3.140000, ADDRESS=4029
d=99.990000, ADDRESS=4021
word=JAPAN, ADDRESS=4011
+------------------------------------------------------------+
/* filename=no007-2.c */
/* include */
#include <stdio.h>
#include <string.h>
/* main */
int main( )
{
char wk[1024];/* 文字型配列 */
char *p;/* ポインタ */
printf("wk[] SIZE %d ADDRESS %d -- %d\n", sizeof(wk), &wk[0], &wk[1023]);
strcpy(wk, "JAPAN.");/* 文字列のコピー */
printf("wk=%s\n", wk);
p=strchr(wk, 'J');/* 文字の検索*/
printf("%c ADDRESS %d\n", *p, p);
p=strchr(wk, 'N');
printf("%c ADDRESS %d\n", *p, p);
return 0;/* 終了 */
}
+------------------------------------------------------------+
上記のソースをコンパイルして実行すると以下のように表示されました。
wk[] SIZE 1024 ADDRESS 2954 -- 3977
wk=JAPAN.
J ADDRESS 2954
N ADDRESS 2958
戻る