На самом деле, никто не отправил ответ на ваш точный вопрос, пока.
Вместо
int (*p_arr)[10] = new int[3][10];
// use, then don't forget to delete[]
delete[] p_arr;
Я предлагаю использовать
std::vector<std::array<int, 10>> vec_of_arr(3);
или если вам не нужно перемещать его и не требуется длительность выполнения:
std::array<std::array<int, 10>, 3> arr_of_arr;
Q1
Как объявить p_b, если я хочу, чтобы каждый элемент был указателем на фиксированный размер массива?
int(**pp_arr)[10] = new std::add_pointer_t<int[10]>[3];
for (int i = 0; i < 3; ++i)
pp_arr[i] = new int[1][10];
// use, then don't forget to delete[]
for (int i = 0; i < 3; ++i)
delete[] pp_arr[i];
delete[] pp_arr;
Современный вариант этого кода
std::vector<std::unique_ptr<std::array<int, 10>>> vec_of_p_arr(3);
for (auto& p_arr : vec_of_p_arr)
p_arr = std::make_unique<std::array<int, 10>>();
или если вам не нужно перемещать его и не требуется длительность выполнения:
std::array<std::unique_ptr<std::array<int, 10>>, 3> arr_of_p_arr;
for (auto& p_arr : arr_of_p_arr)
p_arr = std::make_unique<std::array<int, 10>>();
Q2
В моем примере исходного кода выше, как вызывать new, чтобы p_b указывал на уникальный массив фиксированного размера, равный 10 int, кроме вызова p_b = new int[1][10]
?
Не без переноса массива в другой тип.
std::array<int, 10>* p_arr = new std::array<int, 10>;
// use, then don't forget to delete
delete p_arr;
Вы можете заменить std::array<int, 10>
на ваш любимый тип переноса массива, , но вы не можете заменить его псевдонимом массива фиксированного размера . Современный вариант этого кода:
auto p_arr = std::make_unique<std::array<int, 10>>();