6.5 — Multidimensional Arrays

The elements of an array can be of any data type, including arrays! An array of arrays is called a multidimensional array.

In this case, since we have 2 subscripts, this is a two-dimensional array. In a two-dimensional array, it is convenient to think of the first subscript as being the row, and the 2nd subscript as being the column. Conceptually, the above two-dimensional array is laid out as follows:

[0][0]  [0][1]  [0][2]  [0][3]  [0][4]
[1][0]  [1][1]  [1][2]  [1][3]  [1][4]
[2][0]  [2][1]  [2][2]  [2][3]  [2][4]

To access the elements of a two-dimensional array, simply use two subscripts:

To initialize a two-dimensional array, it is easiest to use nested braces, with each set of numbers representing a row:

When the C++ compiler processes this list, it actually ignores the inner braces altogether. However, we highly recommend you use them anyway for readability purposes.

Two-dimensional arrays with initializer lists can omit (only) the first size specification:

The compiler can do the math to figure out what the array size is. However, the following is not allowed:

Because the inner parenthesis are ignored, the compiler can not tell whether you intend to declare a 1×8, 2×4, 4×2, or 8×1 array in this case.

Just like normal arrays, multidimensional arrays can still be initialized to 0 as follows:

Note that this only works if you explicitly declare the size of the array! Otherwise, you will get a two-dimensional array with 1 row.

Accessing all of the elements of a two-dimensional array requires two loops: one for the row, and one for the column. Since two-dimensional arrays are typically accessed row by row, generally the row index is used as the outer loop.

Multidimensional arrays may be larger than two dimensions. Here is a declaration of a three-dimensional array:

Three-dimensional arrays are hard to initialize in any kind of intuitive way using initializer lists, so it’s typically better to initialize the array to 0 and explicitly assign values using nested loops.

Let’s take a look at a practical example of a two-dimensional array:

This program calculates and prints a multiplication table for all values between 1 and 9 (inclusive). Note that when printing the table, the for loops start from 1 instead of 0. This is to omit printing the 0 column and 0 row, which would just be a bunch of 0s! Here is the output:

1    2    3    4    5    6    7    8    9
2    4    6    8    10   12   14   16   18
3    6    9    12   15   18   21   24   27
4    8    12   16   20   24   28   32   36
5    10   15   20   25   30   35   40   45
6    12   18   24   30   36   42   48   54
7    14   21   28   35   42   49   56   63
8    16   24   32   40   48   56   64   72
9    18   27   36   45   54   63   72   81
6.6 -- C-style strings
6.4 -- Sorting an array using selection sort

45 comments to 6.5 — Multidimensional Arrays

  • Rajesh

    Can you just explain how the 2d arrrany multiplications are done?
    and also sorting of string values using array?

    • I am not sure what you mean by “2d array multiplications”.

      As for using arrays to hold strings, that’s covered in the very next lesson on C-style strings

    • I expect what is meant is matrix multiplication, however that is a topic of maths rather than programming to begin with, later on algorithms though for efficiency. But even the second part is way out of scope for a book on how to use a language. If Rajesh or anyone reading is curious on the topic, I suggest learning the maths first (I do believe KhanAcademy has lessons on linear algebra) and then go read about algorithms.

  • can u gaVE some example of multidimesional array…thank you

  • Peter LaBanca

    For optimization purposes, so you don’t have to repeat the loops twice creating redundancy, isn’t it better to compact the code from:


    With processors nowadays I am sure that won’t impact performance that much but every bit counts, especially with bigger, more complex programs.

    Peter LaBanca

    • Peter LaBanca

      The “t” is supposed to be escaped. AJAX editor must be interferring.

    • In the real world I would have combined the two loops for efficiency reasons. Here, I did not because I thought it made for a cleaner, easier to follow example.

    • TBM

      Your code wouldn’t compile for me do to nCol falling out of scope in the 2nd if statement. Though this code worked fine for me.

      • Protip. Statements such as "Your code wouldn’t compile" or "It doesn’t work" is useless. Please please please, for the love of all that is good, do include compiler errors.

        Now for the code above, a few things that could’ve gone wrong:
        - Missing "using namespace std"
        - Missing "#include <iostream>

  • Chiamaka

    in what section did you talk about “const”?

  • FuturePixstar

    i belive it’s 2.8

  • detroit

    is there any body to create a multiplication table using array in c++?

  • Kevin

    g++ compiler required double { { } } braces as follows compared to the single in the example

    • ca336458

      g++ didn’t require it for me as an error, just gave me a warning when using just the one set of braces. That warning went away when I used 2: int nProduct[nNumRows ][nNumCols ] = {{ 0 }};

  • You may also remove the if statement to shorten the code.

  • Cheesefriend

  • in multidimensional array ,
    one column contain a integer,
    another column contain a string,
    how we declare an array to accept a value

  • I will give two kinds of methods (one is similar to the author’s, but a bit shorter)

    The first method just takes the cout into the loop as well.
    The second is just the stupid-way to do this problem, using additional instead.

  • DaMonroe

    Great, but if you don’t know the length of the actual number of rows, the outer loop can’t be a “for” loop. How could a “while” be controlled when filling an array from a file?

    • copier1

      Arrays have to be initialized with the dimension size. In a later lesson you learn how to do this at run time instead of at the time it’s compiled. In either case, the size does have to be dimensions do have to be known beforehand.

      You can use a function or a class to determine the length and number of rows from the file.

  • Adi_ida

    How to convert an array of 2 dimensions to one dimension?

    • Most of the time that question will be mostly academic albeit interesting, as this is most likely how the memory layout will be designed. However I cannot recall ever having the need to actually do that conversion. But let’s write two 2 dimensional arrays out, where all the fields are numbered in increasing order. Let’s write a 3×3 array first:

      0 1 2
      3 4 5
      6 7 8

      Then 5×4

      0  1  2  3
      4  5  6  7
      8  9 10 11
      12 13 14 15
      16 17 18 19

      Now if you look carefully at the first columns, you may be able to see a pattern. If we name the current row r, and let i start at 0, just like we index arrays, then you can actually calculate these numbers as a factor of the number of columns. To calculate the first number in a row it will start with r*nNumCols, which in turn for the first row gives 0 (as r starts at 0) then you’ll have (r=1) 4 (1*4) and 3 (1*3) respectively and so on.

      Now the observant reader may have noticed that the "r" I introduced is actually exactly the nRow used in the code in the guide.

      To calculate the exact number you also need to add something, but if you take a look at nCol in the examples above this will exactly be the offset needed to be added. So the entire formula will be nRow*nNumCols+nCol (notice that nCol will restart at 0 each iteration and will max be nNumCols-1).

      So actually you can just transform an 2 dimensional array into a 1 dimensional by having the size as nNumRow*nNumCols. Another thing to notice is that the uneeded { and } for multiple dimensions this actually corresponds exactly to this.

      Now to relate that to how the memory maps this. Say we use int32_t as our type for an array. We know from previous lessons that this corresponds to exactly 4 bytes. The way the memory works is that it knows where the array starts, lets call it position A. If the array starts at A the first element will be in the 4 bytes starting at A, the next will be at A+4, and the next as A+8 and so on. The numbers will change according to the data type in use. The formula for the memory will then be A+4*offset where offset is our formula above, so A+4*(nRow*nNumCols+nCol). Then of course we could replace 4 with the size of our type.

      One disclaimer most memory models (as far as I’m aware, bear with me, it’s a long time since I had this) actually index from high memory addresses to low ones, so actually it would be A-4*…, but for understanding this doesn’t matter, and I do believe it’s easier to visualize it increasing in stead of decreasing.

  • Hi Alex..I am a begginer in C++. I have written a code to add matrices,the code is all fine the only problem is that when i m printing the output it is looking something like this 12 12 12 12 12 instead of this i want it as 12 12 12
    12 12 12
    12 12 12..Can u please help me…

  • i.e in matrix form i want to print the output…please help me out…

  • ProgrammerJupiter

    anArray[2][3] = 7;

    int anArray[3][5] =
    { 1, 2, 3, 4, 5, }, // row 0
    { 6, 7, 8, 9, 10, }, // row 1
    { 11, 12, 13, 14, 15 } // row 2

    Just curious wouldnt anArray[2][3] = 14? if i am understanding how this works properly

  • warren2c

    Hi guys.

    Im a beginner and have a project similar to the one described above. For the above project, how do you put all the for loop part into a function? Say if you had multiple arrays of different values, but all of the same size?

  • ErinDwight

    Please help… I have a migraine from trying to do this homework. Could you please help?

    Write a C++ program that finds and displays the maximum value
    in a two-dimensional array of integers. The array should be declared as a 4-by-5 array of
    integers and initialized with the data 16, 22, 99, 4, 18, -258, 4, 101, 5, 98, 105, 6, 15, 2,
    45, 33, 88, 72, 16, and 3.


    using namespace std;

    int main(int argc, char *argv[])
    int array [] = {16, 22, 99, 4, 18, -258, 4, 101, 5, 98, 105, 6, 15, 2, 45, 33, 88, 72, 16, 3};
    for(int j = 0; j < array[i].length; j++)
    if(max < array[i][j])
    max = array[i][j];

    return EXIT_SUCCESS;

    • billy1014

      I saw this and used this as practice. Here’s the solution in case anyone wants it. Let me know if you find a better way.

      int search()

      int array [4][5] = {16, 22, 99, 4, 18, -258, 4, 101, 5, 98, 105, 6, 15, 2, 45, 33, 88, 72, 16, 3};

      int xo = 0;
      int xi = 0;
      for(int nRow = 0; nRow < 4; nRow++)
      for(int nCol = 0; nCol xo)
      {xo = xi;}
      return xo;

  • M. Abdullah

    a program that stores values in an array of 2 rows and 4 columns.
    kindly i want solution of this program !

  • cecil

    i want build a program which i input a phrase and it divid the phrase in the sigle word in the single  row of a table of two dimension like
    the day is beatiful.
    how can i do?

  • Andrei

    Hi - in your multiplication table example the cout code should read

    cout << nProduct[nRow][nCol] << "\t"

    instead of "t".

  • I.P

    Hi, thanks for the great tutorial.
    Following the tutorial, I’v been trying to make vertex-4 coloring code.
    I’m stuck here: vertexColoring[the number of colored maps][the number of whole nodes]
    So, each row stands for one colored map.
    But the problem is that the size of row is an exponential function of the size of column. and It seems the size of this array gets to a limitation very quickly.
    Is there any solution for this? (certainly though, because vertex coloring is one of the computer-science subjects)

  • Michael

    Hello Alex!

    Thx for the great site! I am already recommending it to my friends :)

    Question about arrays - how big can they get?

    In the code below, I use "const long ArraySize = 1000000;" to define the size of my array.

    I defined an array of random numbers that had 100 000 elements and my code runs fine.
    When I increased the size to 1 000 000 elements I get a ‘stack overflow’ message.

    "Unhandled exception at 0x00A930B7 in brudnopis.exe: 0xC00000FD: Stack overflow (parameters: 0x00000000, 0x00282000)."

    Using Windows 7 and MS VS 2013 Express.

    This is just prototyping. I would like to use arrays of structs with up to 10 million elements in the future for modelling.

    Any suggestions?

    PS. I have 16 GB of RAM memory and an i7 Intel processor; waitforuserend() is in another source file - it’s the code you posted at the start of this tutorial. The two commented out lines of code stay commented out when I compile.

    • Alex

      I think Visual Studio sets the stack size to 1MB by default. There should be a compiler option to increase this.

      That said, for something so large, I’d probably look to allocate the memory dynamically instead of statically.

      • Michael

        I wish MS help websites were better…..
        Took me half an hour to figure out how to increase stack size….
        Project -> Properties -> Configuration Properties -> Linker -> System -> Stack Reserve Size

        Set it to 200000000 (around 200 MB i guess?)
        Now my code will run even if I set the ArraySize to 25 million. Takes it 22 seconds to complete.

        I hope I will learn how to ‘allocate memory dynamically’ later on.

        Thanks for your help!

  • Fred

    OK so a two dimensional array is an array of arrays where each row is an array.

    Does a 2D array have to be rectangular. That is, does each row have to have the same number of elements?

  • Snowman

    I’m up to chapter 7 and decided to play around a little, so I made Tic Tac Toe. It’s player vs player (no CPU yet) and very stable. Took 2 or 3 lines off Google purely for incorrect inputs. I’m no where near a professional programmer, so be kind! =P

    Select a number from 1-9 (read left to right) to play. X’s go first


    Website is bugging out with text between less than and greater than signs. Code can be found here:

  • Peter

    In the first example you have

    but then the layout is I think for  

Leave a Comment




four × 3 =

Put C++ code inside [code][/code] tags to use the syntax highlighter