<1次元配列とアドレス>
「変数名だけだと変数の値を示し(例:x)、変数名の前に&をつけるとアドレスを示す(例:&x)」というのが通常の変数の約束です。
配列の場合も、「配列名に添字をつけると要素の値を示し(例:data[2])、それに&つけたものは(例:&data[2])その要素のアドレスを示す」ことになります。
通常の変数と異なるのは、「配列名だけだと、その配列の先頭要素のアドレスを示す」という点です。つまり、配列dataについて、dataと&data[0]は同じになります。
まとめると、
配列名 |
配列の先頭要素アドレスを示す |
配列名[添字] |
配列の要素の値を示す |
&配列名[添字] |
配列の要素のアドレスを示す |
(例) char str1[4]="ABC";
//
str1 str1の先頭要素のアドレス(例えば0x4000)
//
str1[0] str1[0]の値('A')
//
str1[1] str1[1]の値('B')
//
str1[2] str1[2]の値('C')
//
str1[3] str1[3]の値('\n')
//
&str1[0] str1[0]のアドレス(0x4000)
//
&str1[1] str1[1]のアドレス(0x4001)
//
&str1[2] str1[2]のアドレス(0x4002)
//
&str1[3] str1[3]のアドレス(0x4003)
(例) char str1[10], str2[256];
scanf("%c",
&str1[0]); //
str1[0]に文字入力
scanf("%s",
str2); //
str2に文字列入力
<2次元配列とアドレス>
2次元配列のアドレスについては、以下のようになります。
配列名 |
配列の先頭要素のアドレス |
配列名[行] |
行の先頭要素のアドレス |
配列名[行][列] |
配列要素の値 |
&配列名[行][列] |
配列要素のアドレス |
(例) char str2[3][7] = {
"ABC",
"DEFGHI", "JK"
};
//
str2 str2の先頭要素のアドレス(例えば0x4000)
//
str2[0] str2[0]の先頭要素のアドレス(0x4000)
//
str2[1] str2[1]の先頭要素のアドレス(0x4007)
//
str2[2] str2[2]の先頭要素のアドレス(0x400E)
//
str2[0][0] str2[0][0]の中身('A')
//
str2[1][0] str2[1][0]の中身('D')
//
str2[2][0] str2[2][0]の中身('J')
//
&str2[0][0] str2[0][0]のアドレス(0x4000)
//
&str2[1][0] str2[1][0]のアドレス(0x4007)
//
&str2[2][0] str2[2][0]のアドレス(0x400E)
3次元以上の多次元配列についても、同様の考え方で拡張されます。