Вполне легальная конструкция. A - массив указателей на массивы double. Соответственно, выделять такой массив надо в два этапа - сначала выделяем массив указателей, а потом в каждом элементе выделяем массив double. Кстати, в этим случае можно иметь строки разной длины, например - треугольную матрицу.
Стойте-ка. Вот в данном конкретном случае откуда компилятор знает чему равно sizeof(A[i]), чтобы правильно определить то, где в памяти находится A[i][j]? Ведь автор программы нигде память не выделяет. Если автор задаст матрицу в виде double A[100][100], то, передавая её через double **, теряется информация о том, что каждая строка имеет размер 100*sizeof(double) байт. Я об этом пишу.
А в этом случае (как Вы пишите):
Код:
A = new double * [ N ];
for ( int i = 0; i < N; i ++ )
A [ i ] = new double [ любое число ];
все понятно, здесь каждый указатель уже знает, куда указывает. Мы уже явно присвоили всем своё значение.
Кстати, многие неправильно освобождают память в таких случаях. Надо так:
Код:
for ( int i = 0; i < N; i ++ )
delete [ ] A [ i ];
delete [ ] A;