メモリとデータ型 - C言語
コンピュータが扱う最小単位は「1バイト」。これはメモリのデータ信号ピンが8本しかついていないため。
しかし、1バイトしかデータを扱えないということではない。アドレス信号ピンがついていて、これでアドレスを指定し、データの読み書きを行う。
複数バイト使うデータを扱いたい場合には、複数バイト読み書きしないといけない。データ型を指定してプログラミングする。
データ型によって、使用するバイト数は決まっているため、コンピュータはデータ型で判断して読み書きするバイト数を決めている。
データ型 | 使用するバイト数 |
---|---|
char | 1 |
short | 2 |
int | 4 |
以下、データ型によって、書き込んでいるアドレスの間隔が変化することを確認してみた
#include <stdio.h> /* データ型で使用するサイズ */ int main(void){ char c[] = {'a', 'b', 'c'}; // サイズ:1バイト short s[] = {1, 2, 3}; // サイズ:2バイト int a[] = {1, 2, 3}; // サイズ:4バイト // char型の配列の要素のアドレス printf("char型の配列の要素\n"); for (int i = 0; i < sizeof(c); i++) { // 各要素は1バイト printf(" &c[%d] - %p\n", i, &c[i]); } // short型の配列の要素のアドレス printf("short型の配列の要素\n"); for (int i = 0; i < sizeof(c); i++) { // 各要素は2バイト printf(" &s[%d] - %p\n", i, &s[i]); } // int型の配列の要素のアドレス printf("int型の配列の要素\n"); for (int i = 0; i < sizeof(c); i++) { // 各要素は4バイト printf(" &a[%d] - %p\n", i, &a[i]); } }
実行結果
char型の配列の要素 &c[0] - 0x7ffee9d0f9a5 &c[1] - 0x7ffee9d0f9a6 &c[2] - 0x7ffee9d0f9a7 short型の配列の要素 &s[0] - 0x7ffee9d0f99e &s[1] - 0x7ffee9d0f9a0 &s[2] - 0x7ffee9d0f9a2 int型の配列の要素 &a[0] - 0x7ffee9d0f9ac &a[1] - 0x7ffee9d0f9b0 &a[2] - 0x7ffee9d0f9b4
データ型によって使用するバイト数が違うことがわかった
各要素の間隔がデータ型によって、変わっている。char型は1バイト。short型は2バイト。int型は4バイト。
ポインタとデータ型
ポインタとデータ型の関係も面白いと思った
OSによって、メモリ・アドレスが決まっている?64ビットのOSの場合、8バイト?
(あれ、でも、7ffee9d0f9a5
は6バイト(48ビット)だよ...なにこれ...今回は6バイトで話を進めていこう)
表現できるアドレスが6バイトであるため、ポインタに格納できる最大バイト数は6バイトということになる
しかし、ポインタは何か1つのデータ型に紐付けて定義する。アドレスの場所から何バイト分読み書きするかを決めるのがデータ型となっている
以下のコードはポインタを宣言している
char *cp; short *sp; int *ip;
アドレスは6バイトって決まっているのに、charとかshortとかintにポインタをくっつけてる!?
charのポインタは*cp
に格納されているアドレス(6バイト)から1バイト分だけデータを読み書きするということになる!!
それぞれ、アドレスが0000
だった場合、以下のようになる
読み書きするバイト数に違いがあるっていうこと!
参考文献
プログラムはなぜ動くのか 第2版 知っておきたいプログラムの基礎知識
- 作者: 矢沢久雄
- 出版社/メーカー: 日経ソフトウエア
- 発売日: 2007/04
- メディア: 単行本(ソフトカバー)
- 購入: 45人 クリック: 646回
- この商品を含むブログ (73件) を見る