Я столкнулся с каким-то странным кодом в динамическом распределении памяти для 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)в значительной степени не имеет значения, компилятор рассматривает оба как один и тот же, и генерируемый машинный код идентичен. В[] нотация - это просто элемент синтаксиса, который помогает облегчить понимание кода.

Другие вопросы по тегам