C++ является строго типизированным языком. int
- это не то же самое, что и int*
. Аналогично int[3]
- это не тот же тип, что и int*
. Но просто слегка сокрушите int[3]
с палкой, и он развалится и упадет на int*
. C++ делает это, потому что c делает это.
Почему я не могу выделить память, как следующий?
p = new int[3][4];
Поскольку new
возвращает указатель на int[4]
:
auto p1 = new int[3][4]; // int(*p1)[4]
Массив имеет decayed указателю. Он имеет lost the type and first dimension. Было бы лучше избегать указателей на массивы и придерживаться using templates and references. Или еще лучше, предпочитают std::vector
или std::array
.
У вас может быть несколько указателей на тот же адрес, but with different types, который can be confusing.
2) Он должен быть как следующие работы. Но почему?
p = new int [1][3][4];
В этом примере массив int[3][4]
с также распались на указатель:
auto p2 = new int [1][3][4]; // int(*p2)[3][4]
Так вот значение, возвращаемое new
может быть назначен p
, потому что он имеет тот же тип. Обратите внимание, однако, что тип указателя не включает информацию о размере массива, он имеет только тип, который указывает на элементы, которые являются массивами более низкой размерности (которые не разлагаются на указатели).
3) Что следующая строка кода означает? Это семантически правильно , но что он делает? Что такое значение пустого [] в строке ?
p = new int [ ][3][4];
Это не всегда может составить, и если это произойдет, то это compiler extension, который будет определять значение пустых квадратных скобок.
@Muscampester Нет, ничего не добавляю – eyllanesc