授業/C言語基礎/配列 のバックアップ(No.6)


同じ型の変数を複数集めて並べたものを配列といいます。

配列に含まれる変数の数のことを配列の要素数または配列の長さといいます。

配列を宣言する

配列を使うには、変数と同じように、使う前に宣言する必要があります。

配列は同じ型の変数が集まってできていますので、配列に含まれる変数の型を配列の型として宣言します。 配列名の後に角括弧 [ ] を付け、括弧の中に要素数を指定します。

  型 配列名[要素数];

たとえば、要素数3のint型の配列 a を宣言すると、次のようになります。

  int a[3];

配列が宣言されると、要素となる変数を規則するのに必要な容量に要素数をかけた分の記憶容量がまとめて確保されます。

配列の要素にアクセスする

配列の要素にアクセスする(値を代入する、値を参照する)には、配列名の後に角括弧 [ ] を付け、括弧の中に要素番号添字として指定します(プログラム1)。

  int a[3];

  a[0] = 250;
  a[1] = 350;
  a[2] = 500;

  printf("%d\n", a[0]);

要素番号が 0 から始まることに注意しましょう。 したがって、要素番号の最大値は要素数よりも1小さい数です。

演習1

プログラム1を作成し、実行結果を確認せよ。

配列のすべての要素にfor文でアクセスする

for文を使うと、配列のすべての要素に順番にアクセスすることができます。

for文では、0から最大要素番号まで、要素番号を1ずつ増やしながら、配列の要素に繰り返しアクセスします(プログラム2)。

  int a[3];

  a[0] = 250;
  a[1] = 350;
  a[2] = 500;

  printf("%d\n", a[10000]);

演習2

プログラム1をプログラム2に変更し、実行結果を確認せよ。

セグメント・エラー

宣言した範囲を超えた要素番号の要素にアクセスすると、(コンパイル時にはエラーになりませんが、)実行時にエラーになることがあります。

このエラーを、セグメンテーション・フォールト (Segmentation fault)、セグメンテーション違反セグメンテーション・エラーなどといいます。 総合情報センターのLinuxサーバーでは、「セグメンテーションエラー」と表示されます。

たとえば、次のプログラムについて考えてみましょう(プログラム3)。

luna% ./a.out
セグメントエラー

宣言した配列の要素数は3なので、要素番号の範囲は0から2までですが、このプログラムでは要素番号を10000にしています。

このプログラムを実行すると、次のようになります。

  int a[3];
  int i = 12345;

  printf("%d\n", a[3]);

宣言した範囲を超えた要素番号の要素にアクセスしたときに、セグメント・エラーが必ず発生するわけではないことに注意しましょう。 配列とアドレスの関係を勉強するとこの理由がわかりますが、この授業では勉強しませんので、ここでは説明しません。

演習3

プログラム3を作成し、実行結果を確認せよ。

配列を初期化する

配列の値を、宣言時に一度に代入することができます。 これを、配列の初期化といいます。

配列を初期化するときは、波括弧 { } の中にコンマ , 区切りで要素を並べ、リストを作って代入します(プログラム4)。

luna% a.out
12345

配列を初期化するときに要素数を省略すると、初期化するリストの要素数が配列の要素数になります(プログラム5)。

  int a[3];

  a[0] = 250;
  a[1] = 350;
  a[2] = 500;

  for (i = 0; i < 3; i++) {
    printf("%d\n", a[i]);
  }

配列を初期化するときのリストの要素数が宣言された配列の要素数よりも短いときは、残りの要素には 0 が代入されます(プログラム6)。

  int a[] = {1, 2, 3, 4, 5};
  int i, len, sum;

  len = sizeof(a) / sizeof(a[0]);
  sum = 0;
  for (i = 0; i < len; i++) {
    sum += a[i];
  }
  printf("%d\n", sum);

演習4

プログラム4-6を作成し、実行結果を確認せよ。

配列を関数の戻り値にすることはできない

配列そのものを関数の戻り値にすることはできません。

配列が格納されている場所(アドレス、ポインター型の変数)を戻り値にすることによって、実質的には配列を返すことができます。 ただし、ポインターについてはこの授業では勉強しません(C言語応用で勉強します)ので、ここではこのテクニックについては説明しません。

配列を関数の引数にすることはできる

配列を関数の引数にすることはできます。

次のプログラムの関数 sum は、int型の配列を引数として受け取って、その配列に含まれる要素の合計を返す関数です(プログラム7)。

  int a[] = {3, 5, 2, 4, 1};
  int i, len, max;

  len = sizeof(a) / sizeof(a[0]);
  max = a[0];
  for (i = 1; i < len; i++) {
    if (a[i] > max) {
      max = a[i]
    }
  }
  printf("%d\n", max);

配列の要素数を調べる

  int a[] = {3, 5, 2, 4, 1};
  int i, len, max;

  len = sizeof(a) / sizeof(a[0]);
  max = -1;
  for (i = 0; i < len; i++) {
    if (a[i] > max) {
      max = a[i]
    }
  }
  printf("%d\n", max);

2次元配列(配列の配列)

配列とは、同じ型の変数を複数並べたものです。

同じ型で同じ要素数の配列を複数並べると、配列の配列を作ることができます。 これを2次元配列といいます。

2次元配列を宣言するには、角括弧 [ ] と要素数の組をもう一つ追加します。

  int i;
  int a[3] = {250, 350, 500};

  for ( i = 0; i < 3; i++) {
    printf("a[%d] = %d\n", a[i]);
  }

2次元配列の要素にアクセスするには、宣言のときと同様に、角括弧 [ ] と要素番号(添字)の組をもう一つ追加します。

たとえば、要素数3のint型の配列を4つ並べると、[math]3 \times 4[/math]の2次元配列ができます。

  int a[] = {250, 350, 500};

演習

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS