Структура памяти одноразмерного массива (скажем, с тремя элементами) выглядит так:
names ------> [0] [1] [2]
А двумерный массив (скажем, с 3 X 3 элементами) будет выглядеть так:
names ------> [0] --> [0] [1] [2]
[1] --> [0] [1] [2]
[2] --> [0] [1] [2]
^
|
this is an array of pointers
то есть двумерный массив является массивом указателей на массивы, поэтому вам понадобятся ** имена на первом месте.
string **names = new string*[number]; // allocating space for array of string pointers
Теперь вам нужен каждый элемент этого массива строкуказатели для указания на массив строк.
Поэтому вам нужно будет выполнить
for(int i = 0; i < number, i++) {
names[i] = new string[number];
}
Надеюсь, это поможет лучше понять его.