- 追加された行はこの色です。
- 削除された行はこの色です。
同じ型の変数を複数集めて並べたものを''配列''といいます。
配列に含まれる変数の数のことを配列の''要素数''または配列の''長さ''といいます。
*配列を宣言する [#mddc6d6b]
配列を使うには、変数と同じように、使う前に宣言する必要があります。
配列は同じ型の変数が集まってできていますので、配列に含まれる変数の型を配列の型として宣言します。
配列名の後に''角括弧'' ''[ ]'' を付け、括弧の中に要素数を指定します。
#geshi(c){{
変数の型 配列の名前[要素数];
}}
たとえば、要素数3のint型の配列 a を宣言すると、次のようになります。
#geshi(c){{
int a[3];
}}
配列が宣言されると、要素となる変数を規則するのに必要な容量に要素数をかけた分の記憶容量がまとめて確保されます。
*配列の要素にアクセスする [#ie73f304]
配列の要素にアクセスする(値を代入する、値を参照する)には、配列名の後に''角括弧'' ''[ ]'' を付け、括弧の中に''要素番号''(インデックス番号)を指定します。
配列の要素にアクセスする(値を代入する、値を参照する)には、配列名の後に''角括弧'' ''[ ]'' を付け、括弧の中に''要素番号''を''添字''として指定します(プログラム1)。
#geshi(c){{
int a[3];
a[0] = 250;
a[1] = 350;
a[2] = 500;
printf("%d\n", a[1]);
printf("%d\n", a[0]);
}}
要素番号が ''0'' から始まることに注意しましょう。
したがって、要素番号の最大値は要素数よりも1小さい数です。
**演習1 [#ibf8409e]
プログラム1を作成し、実行結果を確認せよ。
*配列のすべての要素にfor文でアクセスする [#xbd65674]
for文を使うと、配列のすべての要素に順番にアクセスすることができます。
for文では、0から最大要素番号まで、要素番号を1ずつ増やしながら、配列の要素に繰り返しアクセスします(プログラム2)。
#geshi(c){{
int a[3];
a[0] = 250;
a[1] = 350;
a[2] = 500;
for (i = 0; i < 3; i++) {
printf("%d\n", a[i]);
}
}}
**演習2 [#c9b6bf09]
プログラム1をプログラム2に変更し、実行結果を確認せよ。
*セグメント・エラー [#if201bbd]
宣言した範囲を超えた要素番号にアクセスすると、(コンパイル時にはエラーになりませんが、)実行時にエラーになることがあります。
このエラーを、''セグメンテーション・フォールト'' (''Segmentation fault'')、セグメンテーション違反、セグメンテーション・エラーなどといいます。
このエラーを、''セグメンテーション・フォールト'' (''Segmentation fault'')、''セグメンテーション違反''、''セグメンテーション・エラー''などといいます。
総合情報センターのLinuxサーバーでは、「セグメンテーションエラー」と表示されます。
たとえば、次のプログラムについて考えてみましょう(プログラム2)。
たとえば、次のプログラムについて考えてみましょう(プログラム3)。
#geshi(c){{
int a[3];
a[10000] = 0;
}}
宣言した配列の要素数は3なので、要素番号の範囲は0から2までですが、このプログラムでは要素番号を10000にしています。
このプログラムを実行すると、次のようになります。
#geshi(sh){{
luna% ./a.out
セグメントエラー
}}
**演習3 [#y7172cc7]
プログラム3を作成し、実行結果を確認せよ。
*配列を初期化する [#o441dac2]
配列の値を、宣言時に一度に代入することができます。
これを、配列の''初期化''といいます。
配列を初期化するときは、''波括弧'' ''{ }'' の中に''コンマ'' '','' 区切りで要素を並べ、リストを作って代入します。
配列を初期化するときは、''波括弧'' ''{ }'' の中に''コンマ'' '','' 区切りで要素を並べ、リストを作って代入します(プログラム4)。
#geshi(c){{
int i;
int a[3] = {250, 350, 500};
for ( i = 0; i < 3; i++) {
printf("a[%d] = %d\n", a[i]);
}
}}
配列を初期化するときに要素数を省略すると、初期化するリストの要素数が配列の要素数になります。
配列を初期化するときに要素数を省略すると、初期化するリストの要素数が配列の要素数になります(プログラム5)。
#geshi(c){{
int a[] = {0, 1, 2};
int a[] = {250, 350, 500};
}}
配列を初期化するときのリストの要素数が宣言された配列の要素数よりも短いときは、残りの要素には 0 が代入されます。
配列を初期化するときのリストの要素数が宣言された配列の要素数よりも短いときは、残りの要素には 0 が代入されます(プログラム6)。
#geshi(c){{
int i;
int a[5] = {250, 350, 500};
for ( i = 0; i < 5; i++) {
printf("a[%d] = %d\n", a[i]);
}
}}
**演習4 [#c9968cf9]
プログラム4-6を作成し、実行結果を確認せよ。
*配列を関数の戻り値にすることはできない [#f6d8c338]
配列そのものを関数の戻り値にすることはできません。
配列が格納されている場所(アドレス、ポインター型の変数)を戻り値にすることによって、実質的には配列を返すことができます。
ただし、ポインターについてはこの授業では勉強しません(C言語応用で勉強します)ので、ここではこのテクニックについては説明しません。
*配列を関数の引数にすることはできる [#xdc23ef4]
配列を関数の引数にすることはできます。
次のプログラムの関数 sum は、int型の配列を引数として受け取って、その配列に含まれる要素の合計を返す関数です(プログラム7)。
#geshi(c){{
int sum(int[3]) {
int i, sum;
sum = 0;
for (i = 0; i < 3; i++) {
sum += a[i];
}
return sum;
}
int main(void) {
int a[3] = {250, 350, 500};
printf("%d\n", sum(a));
return 0;
}
}}
*配列の要素数を調べる [#se6b159b]
#geshi(c){{
length = sizeof(a) / sizeof(a[0]);
}}
*配列の配列(2次元配列) [#r90b185e]