・メモリのアドレスは本当は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 <iostream>
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;
}