new int[n]
не может вернуть результат типа int**
, потому что значение int**
должно указывать на объект типа int*
(объект-указатель).
new int[n]
выделяет память для массива n
объектов, каждый из которых имеет тип int
. Он не создает объект-указатель.
Возвращаемое значение int*
указывает на начальный (0-й) элемент выделенного массива. Доступ к другим элементам массива можно получить с помощью арифметики указателя c.
Это могло быть было определено для получения результата типа int (*)[n]
, который является указателем на массив n
int
элементов, за исключением того, что (а) C ++ не допускает массивы с непостоянными границами, и (б) даже для чего-то вроде int (*)[4]
это менее удобно, чем int*
.
C ++, как и язык его предков C, рассматривает массивы как граждан второго сорта. Выражения массива в большинстве, но не во всех контекстах "преобразуются" (корректируются во время компиляции) в выражения указателя, указывающие на начальный элемент объекта массива, а доступ к элементам массива осуществляется с помощью арифметики указателя c. (Оператор индексации a[i]
- это синтаксис c сахар для *(a+i)
).
Да, все это может сбивать с толку и противоречить интуиции.
Рекомендуемая литература: Раздел 6 comp.lang. c FAQ (большая часть относится как к C, так и к C ++).