Thinkers'Studio
JavaとC言語の自習ツール
2次元配列の初期化、関数に渡すサンプル (C言語版)

 2次元配列を関数に渡すとき、引数宣言をどのようにするか迷ったことはありませんか?
 バスの空き座席を数えるプログラムで、例を示します。

2次元配列の初期化、関数に渡すサンプル 】
 2次元配列 seats を関数 notReservedCnt に渡し、0:空き座席を数えた結果をプリントします。
#include <stdio.h>
#define COLS  16  //列の数
#define SEATS 4   //1列の座席数

int notReservedCnt( int seats[COLS][SEATS] )
{
    int i, j, cnt;

    cnt = 0;
    for( i = 0; i < COLS; i++ )
        for( j = 0; j < SEATS; j++ )
            if( seats[i][j] == 0 ) cnt++;
    return cnt;
}

main()
{
    int   seats[COLS][SEATS] =
          { { 1,0,0,1 }, { 0,0,0,1 }, { 1,0,0,0 }, { 1,1,0,1 }
          , { 1,0,1,1 }, { 1,1,1,1 }, { 1,1,1,1 }, { 0,1,1,1 }
          , { 0,1,1,1 }, { 1,1,1,1 }, { 1,1,0,1 }, { 1,1,0,0 }
          , { 1,1,1,1 }, { 1,1,1,1 }, { 1,1,1,1 }, { 0,0,0,1 } };

    int cnt = notReservedCnt( seats );
    printf( "空き座席数 = %d\n", cnt );
}

2次元配列の初期化、関数との受け渡し

2次元配列の初期化

 { } の中に、下位の配列要素の値を指定し、それらを並べたものを { と } で囲んで、配列の配列を指定します。
 初期化と同時に宣言する場合、1次元配列ではサイズを省略できました。 2次元配列では、最上位(一番左の次元)のサイズは省略しても構いません。下位のサイズは指定しないとコンパイル・エラーになります。  
   int   seats[COLS][SEATS] =  … はOK
   int   seats[][SEATS] =      … はOK
   int   seats[][] =           … はNG

2次元配列を関数に渡す

 1次元の配列のように、ポインタの形で渡すことはできません。 引数宣言は、2次元配列で書きます。
 サイズが省略できるのは、初期化を伴う宣言と同様、最上位のサイズだけです。  
   int notReservedCnt( int seats[COLS][SEATS] )  … はOK
   int notReservedCnt( int seats[][SEATS] )      … はOK
   int notReservedCnt( int seats[][] )           … はNG

(今回のクイズです)
 上のプログラムで、バスを2台にします。そして3次元配列を使うものとします。
 初期化の仕方や関数の引数宣言を、どのように変えればよいか考えてみてください。
   (答えは、次回のC言語の Tips で ・・・)

[ 関連記事 ] 2次元配列の操作例(平均点)

前回のクイズの答え: (前回の問題を見る
  rand() % 6 + 1 とする