今回は配列がどうどうどうなっているか、実際にプログラムを組んで確かめてみたいと思います。諸般の事情により表示には今回もまた printf を使います。
では、今回の要点です。
前回とあまり変わりませんね。では、いってみましょう。
前回「配列変数はメモリ上に連続して存在している」と言いました。では、わかりやすいように、大きさが1バイトである char 型を使ってそれを確かめてみましょう。
ついでに「配列変数名は配列の先頭アドレスを指す」というのも確かめてみます。
| プログラム | 実行結果例 |
|---|---|
// Array3.cpp
#include <stdio.h>
int main()
{
int i;
char array[10];
// %d は整数表示、\n は改行です
printf("array : %d\n\n", array);
for(i = 0; i < 10; i++)
printf("&array[%d] : %d\n", i, &array[i]);
return 0;
} |
array : 6618600 &array[0] : 6618600 &array[1] : 6618601 &array[2] : 6618602 &array[3] : 6618603 &array[4] : 6618604 &array[5] : 6618605 &array[6] : 6618606 &array[7] : 6618607 &array[8] : 6618608 &array[9] : 6618609 |
偶然ですが、非常にわかりやすい値になってくれました。きちんと順番に並んでいることがよくわかります。
そして、array と &array[0] はきちんと同じ値になっています。array[0] は配列の先頭ですから、そのアドレスは配列全体の先頭アドレスになります。それと array とが同じということは、array は配列全体の先頭アドレスを指していることになります。
では、今度はこの配列を関数に渡したものと比べてみましょう。
| プログラム | 実行結果例 |
|---|---|
// Array3b.cpp
#include <stdio.h>
void DisplayAddresses(char* pointer)
{
int i;
printf("pointer : %d\n", pointer);
for(i = 0; i < 10; i++)
printf("&pointer[%d] : %d\n", i, &pointer[i]);
}
int main()
{
int i;
char array[10];
printf("array : %d\n", array);
for(i = 0; i < 10; i++)
printf("&array[%d] : %d\n", i, &array[i]);
printf("\n");
DisplayAddresses(array);
return 0;
} |
array : 6618600 &array[0] : 6618600 &array[1] : 6618601 &array[2] : 6618602 &array[3] : 6618603 &array[4] : 6618604 &array[5] : 6618605 &array[6] : 6618606 &array[7] : 6618607 &array[8] : 6618608 &array[9] : 6618609 pointer : 6618600 &pointer[0] : 6618600 &pointer[1] : 6618601 &pointer[2] : 6618602 &pointer[3] : 6618603 &pointer[4] : 6618604 &pointer[5] : 6618605 &pointer[6] : 6618606 &pointer[7] : 6618607 &pointer[8] : 6618608 &pointer[9] : 6618609 |
array 、つまり、配列変数 array の先頭のアドレスを引数 pointer に受け渡します。すると、pointer[3] や pointer[7] などは pointer から3バイト、7バイト離れたところにある変数になります。
array[0] と pointer[0] から array[9] と pointer[9] まで、お互いのアドレスは常に一致しています。アドレスが同じなのですから、array[1] と pointer[1] などは全く同じ変数になっていることになりますよね。
このように、ポインタは配列の受け渡しに欠かせないものなのです。
しかし、これを見ただけでは array と pointer の区別が付きませんね。完璧と思えるほどに array と pointer は同様の操作で同様の結果をはじいてくれます。
ただし、もちろん全てが同じわけではありません。pointer はポインタなので代入ができますが、array はポインタではないのでできません。他にもまだ異なる結果になるものはあります。このことには注意しましょう。
今回はもうこれで終わりです。それでは、要点を振り返ってみましょう。
では、次回まで。さようなら。
Last update was done on 1999.4.15
この講座の著作権はロベールが保有しています