How can I initialize 2d array with a list of 1d arrays?

raw arrays in C++ are kind of second class citizens. They can't be assigned and they can't be copied, which means you can't use them to initialize other arrays, and their name decays into a pointer in most circumstances.

Lucky C++11 offers a solution. std::array acts like a raw array, but it doesn't have the drawbacks. You can use those instead to build a 2d array like

std::array<int, 3> foo = {1,2,3};
std::array<int, 3> bar = {3,4,5};
std::array<std::array<int, 3>, 2> baz = {foo, bar};

and if you have C++17 support you can leverage class template argument deduction to get rid of having to specify the template parameters and the code simplifies to

std::array foo = {1,2,3};
std::array bar = {3,4,5};
std::array baz = {foo, bar};

which you can see working in this live example


Use std::array.

auto a = std::array{ 1,2,3 };
auto b = std::array{ 4,5,6 };
auto array = std::array{ a,b };

Demo


The way you presented - not at all... You can have:

int array[][3] = { { 1, 2, 3 }, { 4, 5, 6 } };

If you still need a and b, you could then have these as pointers:

int* a = array[0];
int* b = array[1];

or a bit closer to your original try: References to array:

int(&a)[3] = array[0];
int(&b)[3] = array[1];

This way, you could still e. g. apply sizeof to a and b...

Or the other way round: create an array of pointers

int a[] = { 1,2,3 };
int b[] = { 4,5,6 };
int* array[] = { a, b };

All these solutions presented so far have in common that both a and array[0] access exactly the same data. If you actually want to have two independent copies instead, then there's no way around copying the data from one into the other, e. g. via std::copy.

If you switch from raw array to std::array, though, you can have this kind of initialisation (with copies) directly:

std::array<int, 3> a;
std::array<int, 3> b;
std::array<std::array<int, 3> 2> array = { a, b };