5.11.7 Two-Dimensional Arrays

A two-dimensional array is a grid of rows and columns. To create one in the run-time stack, use something like

  double grid[5][10];
which creates an array of 5 rows and 20 columns in the run-time stack. To create it in the heap instead, use
  double* grid = new double[5][10];
To delete an array that is in the heap, use
  delete [] grid;

To use a two-dimensional array, use grid[i][j] to indicate the variable in grid at row i, column j. Both rows and colums are numbered starting at 0.

You can also use grid[i] to indicate the entire row at index i. So

Storage of two-dimensional arrays

The variables of a two-dimensional array are stored consecutively in memory by rows. For example, if B is created by
  int B[3][2];
then the variables in array B are stored in the following order:
  B[0][0]
  B[0][1]
  B[1][0]
  B[1][1]
  B[2][0]
  B[2][1]

In general, if array B has r rows and c columns then the memory address of B[i][j] is B + c*i + j.


Passing two-dimensional arrays as parameters

Because the computation of the memory address of B[i][j] requires knowledge of the number of columns in two-dimensional array B, the compiler needs to know how many columns B has. If you pass a two-dimensional array as a parameter, you must include the number of columns. For example,
  // sum(A,n) returns the sum of all numbers in array
  // A[0,...,n-1].

  int sum(int* A, int n)
  {
    int total = 0;
    for(int i = 0; i < n; i++)
    {
      total += A[i];
    }
    return total;
  }

  // rowsums(B, r) returns an array of the row-sums of
  // two-dimensional array B, which has r rows.
  //  For example, if B holds
  //    2 3 4
  //    5 6 7
  //    2 4 6
  //    7 8 9
  // then sum(B,4) returns an array (allocated in the heap
  // using new) holding
  //
  //    9
  //    18
  //    12
  //    24

  int* rowsums(int B[][3], int r)
  {
    int* A = new int[r];
    for(int i = 0; i < r; i++)
    {
      A[i] = sum(B[i], 3);
    }
    return A;
  }

Looping through a two-dimensional array

To look at each thing in a two-dimensional array, you typically use two nested for-loops. For example, the following function writes two-dimensional array G in a grid format.
  void show(int G[][5], int r)
  {
    for(int i = 0; i < r; i++)
    {
      for(int j = 0; j < 5; j++)
      {
        printf("%8i", G[i][j]);
      }
      printf("\n");
    }
  }
Note that the coding standards for this course require only one looop per function. To look at all members of a two-dimensional array with that restriction, you would write a function that handles a single row, as suggested by the following implementation of show.
  void showRow(int G[][5], int i)
  {
      for(int j = 0; j < 5; j++)
      {
        printf("%8i", G[i][j]);
      }
      printf("\n");
  }

  void show(int G[][5], int r)
  {
    for(int i = 0; i < r; i++)
    {
      showRow(G, i);
    }
  }


Exercises

  1. Write a statement that allocates a new two-dimensional array or doubles with 3 rows and 14 columns in the heap, and makes variable t point to it. Answer

  2. Write a function that takes a two-dimensional array of ints as a parameter, where the array has 10 colums and 5 rows. The function should store 0 into each spot in the array. Answer