Итак, рассмотрим этот код:
char** pool = new char*[2];
pool[0] = new char[sizeof(char)*5];
Насколько я знаю, это создает указатель на массив из 2-х символьных указателей. Затем вторая строка устанавливает первый из этих двух указателей на первый элемент в массиве из 5 символов. Пожалуйста, поправьте меня, если я ошибаюсь.
Если я не ошибаюсь
Насколько я знаю, это создает указатель на массив из 2-х символьных указателей. […]
char** pool = new char*[2];
Нет, эта строка создает указатель на указатель символа. Выражение справа создает массив из 2 указателей на символы. Вы можете инициализировать этот двойной указатель с массивом указателей, потому что правая часть превратится в двойной указатель.
Затем вторая строка устанавливает первый из этих двух указателей на первый элемент в массиве из 5 символов. […]
pool[0] = new char[sizeof(char)*5];
Что вы подразумеваете под «первым из этих двух указателей на символы»? Вы назначаете только один указатель на эту строку.
Как бы я проинициализировал все эти символы?
Используя цикл для итерации указателей и назначения им действительной памяти.
Как бы я сменил конкретный символ? Например, установка последнего символа в
NULL
в каждом массиве.for (char** p = pool; p != (pool + 2); ++p) { *p = new char[/* amount of chars */]; (*p)[/* amount of chars */] = '\0'; }
Но это полный беспорядок. Было бы значительно проще использовать вектор строк:
std::vector<std::string> pool;
Других решений пока нет …