Привет, я наткнулся на код, который мне трудно понять, почему он работает, и я был бы признателен, если бы кто-то мог объяснить мне
Вот код Это на самом деле очень упрощенная версия реального кода, который можно найти здесь http://acts.nersc.gov/hypre/example10/ex10.cxx.html
#include <iostream>
int main(int argc, char *argv[]){
double ***elemStiff = new double**[10];
int i, k;
for (i = 0; i < 10; i++){
elemStiff[i] = new double*[4];
for (k = 0; k < 4; k++){
elemStiff[i][k] = new double[4];
}
double **A = elemStiff[i];
for (k = 0; k < 4; k++)
A[k][k] = 2/3.;
A[0][1] = A[1][0] = -1/6.;
A[0][2] = A[2][0] = -1/3.;
A[0][3] = A[3][0] = -1/6.;
A[1][2] = A[2][1] = -1/6.;
A[1][3] = A[3][1] = -1/3.;
A[2][3] = A[3][2] = -1/6.;
}
std::cout << elemStiff[1][0][0] << std::endl;
}
Вкратце, здесь мы инициализируем и заполняем значения массива elemStiff, который имеет 10 строк, и каждая строка представляет собой матрицу 4×4.
Что мне очень странно, так это то, что код заполняет записи в массиве elemStiff с помощью double ** A = elemStiff [i];
Когда я впервые увидел, я бы это выдал ошибку, но это работает! Значения, переданные в A, они передаются одновременно в массиве elemStiff, но я не понимаю, почему это работает
Спасибо
Давайте начнем с более простой версии:
int* array = new int[10];
int* ptr = array; // equivalent to ptr = &array[0]
for (int i = 0; i < 10; ++i)
ptr[i] = i; // writing into the memory that ptr points to
for (int i = 0; i < 10; ++i)
std::cout << array[i]; // outputs: 0123456789
В этом примере мы создаем указатель ptr
это указывает на первый элемент array
, Затем, когда мы пишем в память, что ptr
указывает на то, что мы на самом деле пишем, что array
, Итак, когда мы проверяем значения array
элементы, мы можем видеть, что они были правильно инициализированы.
Ваш код почти такой же, есть только массив из 10 двумерных массивов:
double ***elemStiff = new double**[10];
А потом так же, как мы использовали ptr
в моем простом примере вы используете временный указатель A
чтобы указать на каждый из этих 10 двумерных массивов:
for (i = 0; i < 10; i++)
double **A = elemStiff[i];
Других решений пока нет …