В чём ошибка?
double arr[5][5];
double** ptr = (double**)arr;
Вот здесь вы скастили double(*)[5]
к double**
. Дальше, при первом разыменовании arr[row]
вы получаете мусорный адрес, а при втором arr[row][col]
- segfault.
Конструкция array[idx]
является синтаксическим сахаром для *(array+idx)
. Таким образом, array[row][col]
- это *(*(array+row)+col)
.
Массивы и указатели
Массив может быть приведён только к указателю на первый элемент (array to pointer decay). Двумерные массивы тут исключением не являются:
constexpr int rows = 5;
constexpr int cols = 7;
double array[rows][cols];
double (*ptr1)[cols] = array; // double(*)[7] - указатель на массив double[7]
double* ptr2 = *array; // уазатель на первый элемент первого подмассива
// здесь происходит двойной 'array to pointer decay' через разыменование
for (int row = 0; row < rows; ++row)
for (int col = 0; col < cols; ++col)
ptr2[row*cols+col] = 0; // any expression
C++23: operator[]
А ещё в C++23
появился operator[](Ts...)
, который может принимать аргументы разных типов по принципу: object["string"s,37,3.14159]
. Так что вы можете создать свой класс для удобства: array[row,col]
.