Multidimensional arrays (aka multi-subscripted arrays)
int a[3][4];		// 3 x 4 array (3 rows, 4 columns)
int b[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};	
int c[3][4] = {{0},{0},{0}};		// uninitialized cols are zero

From text example Fig. 6.21.
int array1[ 2 ][ 3 ] = { { 1, 2, 3 }, { 4, 5, 6 } };
int array2[ 2 ][ 3 ] = { 1, 2, 3, 4, 5 };	// = 1 2 3 // 4 5 0
int array3[ 2 ][ 3 ] = { { 1, 2 }, { 4 } }; // = 1 2 0 // 4 0 0

Passing to function:
	countZeroElements(array1);		// call to function
Function prototype:
	int countZeroElements(const int a[][3]);		// function must know second number
Function must know all but the first number (dimension)
Why? array is stored "flat" - needs to know how far to index for next row

Multidimensional array functions often use nested "for" loops
	for (row=0; row<nrows; row++) {
		for (col = 0; col<ncols; col++) {
			a[row][col] = row * col;	// create a multiplication table
		}
	}

