===== 配列とメモリアドレス ===== ・メモリのアドレスは本当は4byte(32bit)が基本 ・説明のためにアドレスは16bitしかないことにして話します int a[5]; intは4バイトの整数 intの要素数5の配列    ↓16進アドレス表記    0x0002 |00000000| 0x0003 |00000000| a[0] 0x0003 |00000000 00000000 00000000 00000000| a[0] 0x0004 |00000000| a[0] 0x0007 |00000000 00000000 00000000 00000000| a[1] 0x0005 |00000000| a[0] ===> 0x000B |00000000 00000000 00000000 00000000| a[2] 0x0006 |00000000| a[0] 0x000F |00000000 00000000 00000000 00000000| a[3] 0x0007 |00000000| a[1] 0x0013 |00000000 00000000 00000000 00000000| a[4] 0x0008 |00000000| a[1] 0x0009 |00000000| a[1] 0x000A |00000000| a[1] 0x000B |00000000| a[2]    A 10 0x000C |00000000| a[2] B 11 0x000D |00000000| a[2] C 12 0x000E |00000000| a[2] D 13 0x000F |00000000| a[3] E 14 0x0010 |00000000| a[3] F 15 0x0011 |00000000| a[3] 0x0012 |00000000| a[3] 0x0013 |00000000| a[4] 0x0014 |00000000| a[4] 0x0015 |00000000| a[4] 0x0016 |00000000| a[4] 0x0017 |00000000| 0x0018 |00000000| ↓unsigned charは符号なしの8bit整数 unsigned char b[6] = { 0, 1, 2, 3, 4, 5 }; システムからはbの先頭アドレスは、0x0006が返されました。    ↓16進アドレス表記    0x0002 |00000000| 0x0003 |00000000| 0x0004 |00000000| 0x0005 |00000000| 0x0006 |00000000| ===> 0x0006 |00000000| a[0] 0x0007 |00000000| ===> 0x0007 |00000001| a[1] 0x0008 |00000000| ===> 0x0008 |00000010| a[2] 0x0009 |00000000| ===> 0x0009 |00000011| a[3] 0x000A |00000000| ===> 0x000A |00000100| a[4] 0x000B |00000000| ===> 0x000B |00000101| a[5] 0x000C |00000000| 0x000D |00000000| 0x000E |00000000| 0x000F |00000000| 0x0010 |00000000| 0x0011 |00000000| 0x0012 |00000000| 0x0013 |00000000| 0x0014 |00000000| 0x0015 |00000000| 0x0016 |00000000| 0x0017 |00000000| 0x0018 |00000000| ・配列は、その宣言とともに、メモリ上に連続の領域として確保される!  じゃぁ。。。。C言語、C++でアドレスを見ることってできるの?  int a = 5; <-int 型の変数a  アドレス演算子 & (アドレスが確実に変数やオブジェクトに割り当てられていなければ取得できない)  aのアドレス => &a cout << hex << &a; aのアドレス を 16進数で出力しなさい ===== 実際にプログラムで確認してみる ===== #include using namespace std; // じゃぁ。。。。C言語、C++でアドレスを見ることってできるの? // int a = 5; <-int 型の変数a // アドレス演算子 & //(アドレスが確実に変数やオブジェクトに割り当てられていなければ取得できない) // aのアドレス => &a // cout << hex << &a; aのアドレス を 16進数で出力しなさい int main() { int a = 5; cout << " a = " << a << endl; cout << "&a = " << hex << &a << endl; int aa[5] = {0, 1, 2, 3, 4 }; for(int i=0;i < 5;i++) { cout << " aa[" << i << "] = " << aa[i] << endl; cout << "&aa[" << i << "] = " << hex << &(aa[i]) << endl; } //配列の名前は、配列の先頭アドレスを指す (&(aa[0]) == aa) <- true cout << "aa+0 = " << hex << aa << endl; //配列名に、配列の1要素の容量分ずつ、アドレスを足せます。 cout << "aa+1 = " << hex << aa+1 << endl; cout << "aa+2 = " << hex << aa+2 << endl; cout << "aa+3 = " << hex << aa+3 << endl; cout << "aa+4 = " << hex << aa+4 << endl; } ==== 補足 ==== * アドレスの取得 => 変数名に& double a; アドレスは &a * 変数名、メモリ領域が確定していないとアドレスは取得できない(当たり前だけど) * 配列の変数名は、配列の先頭アドレスと同値 * int a[5]; の時 &(a[0]) と a は同じメモリアドレスを指す! * メモリアドレスはメモリ1byteごとに割り当てられてるっぽい * 配列は、必ずメモリが連続して配置される=アドレスが連続している(上の図参照) * 配列の番号が1進むと、メモリアドレスは配列の型分進む