<STEP1>
配列とポインタ
配列にも、変数と同様にポインタが存在します。配列を初期化して、ポインタを確認してみましょう。
配列のポインタを指定する際、変数の時と同様に、
&list[0]
&list[1]
&list[2]
&list[3]
&list[4]
....のように、配列に&をつけます。

#include <stdio.h>
int main(){
    int list[5] = {3,15,8,9,21};
    int i;
    for(i=0; i<5; ++i){
        printf("%p\n", &list[i]);
    }
    return 0;
}

表示結果を見ると、同じ数ずつ増えていることがわかります。配列の宣言をする際、同じ大きさの箱が用意されるからです。

演習
long long型の配列を宣言して、どのようにアドレスが動いているのか確認してみましょう。


<STEP2>
&を使わない指定方法

「配列名」が配列の先頭要素のアドレスを示しています。
「配列名+2」のように指定すると、配列の添え字の2が書かれた要素のアドレスを示すことになります。
したがって、配列でscanf文を書く場合は以下のようになります。

#include <stdio.h>
int main(){
    int list[5];
    int i , j;
    for(i=0; i<5; ++i){
        printf("%d番目の配列の値を入力してください: ", i+1);
        scanf("%d", list + i);
    }

    for(j=0; j<5; ++j){
        printf("%d\n", list[j]);
    }
    return 0;
}


<STEP3>
配列名に*をつけると…

ポインタ変数に*をつけると、ポインタが指し示す要素を直接表すことができました。
配列名に*をつけるとどうなるのか確認しましょう。

#include <stdio.h>
int main(){
    int list[5];
    int i;
    for(i=0; i<5; ++i){
        printf("%d番目の配列の値を入力してください: ", i+1);
        scanf("%d", list + i);
    }


    printf("%d\n", *list);
    
    return 0;
}

1番目の配列の値を取ってこれることは確認できましたか?

それでは、2番目の配列の値をとる方法を考えましょう。


#include <stdio.h>
int main(){
    int list[5];
    int i;
    for(i=0; i<5; ++i){
        printf("%d番目の配列の値を入力してください: ", i+1);
        scanf("%d", list + i);
    }


    printf("%d\n", *list);
    printf("%d\n", *list + 1);

    return 0;
}

これでは、1番目の配列の中身(値)に1を足していることに気づきましたか?
「 *(list + 1) 」のように記述しないと、次の配列の要素にアクセスできません。

ちなみに…

list[0]  =  *list
list[1]  =  *(list+1)
list[2]  =  *(list+2)
list[3]  =  *(list+3)
list[4]  =  *(list+4)
list[5]  =  *(list+5)
.......


このような同値関係があることを確認してください。