Я столкнулся с каким-то странным кодом в динамическом распределении памяти для 2D-массивов в C++? пожалуйста, объясните мне, что это?
Код :- p = new int *[5];
где p - указатель и объявлен как int **P;
Пожалуйста, объясните мне, почему существует *
между новым и [5].
1 ответ
При выделении массива с помощью new
вам нужно указать тип. Общая схема такова:
type* x = new type[n];
где type
это базовый тип, x
переменная, а n
количество записей. Вы можете сделать это типом указателя, добавив*
в обе стороны:
type** x = new type*[n];
Вы можете продолжать это бесконечно:
type**** x = new type***[n];
Хотя на практике такое редко можно увидеть, поскольку такие слишком глубокие структуры - не что иное, как неприятности.
В C++, в силу своего наследия C, указатели и массивы взаимозаменяемы, так как оба эти определения в основном эквивалентны:
void f(int* x)
void f(int x[])
Внутри вы можете использовать x
либо как указатель, либо как массив, либо как оба:
int y = x[0];
int z = *x;
Точно так же они идентичны:
int y = x[1];
int z = *(x + 1);
В целом различие между x[n]
а также *(x + n)
в значительной степени не имеет значения, компилятор рассматривает оба как один и тот же, и генерируемый машинный код идентичен. В[]
нотация - это просто элемент синтаксиса, который помогает облегчить понимание кода.