Понимание использования указателей

Привет, я наткнулся на код, который мне трудно понять, почему он работает, и я был бы признателен, если бы кто-то мог объяснить мне
Вот код Это на самом деле очень упрощенная версия реального кода, который можно найти здесь 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, но я не понимаю, почему это работает

Спасибо

1

Решение

Давайте начнем с более простой версии:

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];
3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]