<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)
.......
このような同値関係があることを確認してください。