as separate one-dimensional arrays In C, all three methods can be used. When the first method is used, the programmer decides how the elements of the array are laid out in the computer's memory, and provides the formulas to compute the location of each element. The second method is used when the number of elements in each row is the same and known at the time the program is written. The programmer declares the array to have, say, three columns by writing e.g. . One then refers to a particular element of the array by writing . The compiler computes the total number of memory cells occupied by each row, uses the first index to find the address of the desired row, and then uses the second index to find the address of the desired element in the row. When the third method is used, the programmer declares the table to be an array of pointers, like in . When the programmer subsequently specifies a particular element , the compiler generates instructions to look up the address of the row specified by the first index, and use this address as the base when computing the address of the element specified by the second index. void mult3x3f(float result[][3], const float A[][3], const float B[][3]) { int i, j, k; for (i = 0; i < 3; ++i) { for (j = 0; j < 3; ++j) { result[i][j] = 0; for (k = 0; k < 3; ++k) result[i][j] += A[i][k] * B[k][j]; } } } In other languages In other programming languages such as Pascal, indices may start at 1, so indexing in a block of memory can be changed to fit a start-at-1 addressing scheme by a simple linear transformation – in this scheme, the memory location of the ith element with base address b and element size s is . References Programming with C++, J. Hubbard, Schaum's Outlines, McGraw Hill (USA), 1996, Tensor Calculus, D.C. Kay, Schaum's Outlines, McGraw Hill (USA), 1988, Mathematical methods for physics and engineering, K.F. Riley, M.P. Hobson, S.J. Bence, Cambridge University Press, 2010, Mathematical notation Programming constructs