C/C++ ポインター入門 > メモリ
Nobuhide Tsuda
Oct-2013
 
メモリ
	- PC の中にはメモリというものが入っているぞ。
 
	- メモリはデータを蓄えておくところだ。
 
	- 電源を切ってもデータが消えないHDDに比べ、電源を切るとデータが消えてしまうぞ。
 
	- そのかわり、データの読み書きが HDD よりもかなり高速だぞ。
 
	- メモリは下図のようになってるぞ
 
	
	
- ひとつの箱がデータを入れるところ。そこには1バイトのデータを入れることが出来るぞ
 
	
		- 1バイトとは8ビットのことだ。10進数で言えば 0~255、16進数で言えば 0x00 ~ 0xff までのデータを格納できるぞ。
		
忘れている人は2進数・16進数を参照してね 
	
	- それぞれの箱には0から始まる番号がついていて、それをキーにしてデータにアクセスするんだぞ。
 
	- その番号のことを「アドレス」または「番地」って呼ぶんだぞ。
 
	- 最近のPCだと箱の数は 2^32 = 約41億、または 2^64 = 1.8*10^19 というトンデモない数だぞ。
 
	- ひとつの箱には1バイトのデータしか入れることが出来ない。
 
	- C/C++ の int のサイズは4バイトなので、それをメモリに入れると4つの箱を使うぞ
 
	- データを箱に入れる順番は、下位バイトから入れていくのと、上位バイトから入れていくのの2種類があるぞ。
 
	- 前者を「リトル・エンディアン」、後者を「ビッグ・エンディアン」と呼ぶぞ。
 
	- どちらなのかは CPU の種類で決まっている。
 
	- 普通のPCのCPUは「リトル・エンディアン」だぞ。
 
	- あなたの環境が「リトル・エンディアン」なのか「ビッグ・エンディアン」なのかを判定するには、
	下記のプログラムをビルド・実行するといいぞ
 
#include <iostream>
#include <iomanip>
#define    hexformat(fill,wd)    std::hex<<std::setfill(fill)<<std::setw(wd)
int main()
{
    const int SIZE = sizeof(int);
    unsigned char v[SIZE];    //    int の値を入れるための配列
    int x = 0x12345678;
    *(int *)&v[0] = x;        //    配列 v に無理やり x の値を格納
    for(int i = 0; i < SIZE; ++i) {
        std::cout << "v[" << i << "] = 0x"
                      << hexformat('0', 2) << (int)v[i] << "\n";
    }
}
	実行結果:
v[0] = 0x78
v[1] = 0x56
v[2] = 0x34
v[3] = 0x12
	上記のように、下位バイトから順にメモリに格納されていれば「リトル・エンディアン」だぞ
 
前:2進数、16進数
|上:C/C++ ポインタ入門
|次:ポインタの宣言・初期化