Подтвердить что ты не робот

Запугивание декларации и инициализатора

Эта декларация очень запутанна:

char* q {new char[1024]{}}; // q[i] becomes 0 for all

Является ли это "указателем на массив char" или "массив указателей char"?

Я думаю, что new char[1024]{} инициализирует массив char из 1024 элементов, каждый из которых имеет значение 0.

Итак, это то же самое, что:

char* q = [0,0,....] // until 1024

Правильно?

4b9b3361

Ответ 1

q является указателем на char. Другими словами, он имеет тип char *.

Он инициализируется с помощью выражения new char[1024]{}, который динамически выделяет массив char и нуль инициализирует их. Если это не удастся, будет выбрано исключение.

q будет указывать на первый char в динамически распределяемом массиве. Это не массив.

Это не то же самое, что

char * q = [0,0,....]//до 1024

поскольку это недопустимый синтаксис. Это также не эквивалентно

char* q = {0,0,....}; //  1024 zeros in initialiser

поскольку q является указателем и не может быть инициализирован набором значений. Это ближе (нетто) к эффекту

char *q = new char[1024];     //  dynamically allocates chars uninitialised here
std::fill(q, q + 1024, '\0');

за исключением того, что символы инициализируются нулем, а не сначала не инициализируются, а затем перезаписываются нулями (и, конечно же, до компилятора зависит, как он инициализирует символы).

Ответ 2

char* q {new char[1024]{}};

равно

char* q = new char[1024]{};

который, в свою очередь, равен

char* q = new char[1024] { 0, 0, 0, 0 /* 1020 more zeros */ }