第36章 配列再々考

 今回は配列がどうどうどうなっているか、実際にプログラムを組んで確かめてみたいと思います。諸般の事情により表示には今回もまた 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 はポインタではないのでできません。他にもまだ異なる結果になるものはあります。このことには注意しましょう。


 今回はもうこれで終わりです。それでは、要点を振り返ってみましょう。


 では、次回まで。さようなら。


第35章 配列再考 | 第37章 参照

Last update was done on 1999.4.15

この講座の著作権はロベールが保有しています