今回は配列がどうどうどうなっているか、実際にプログラムを組んで確かめてみたいと思います。諸般の事情により表示には今回もまた 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
この講座の著作権はロベールが保有しています