1

こんにちは私はそれが機能している理由を理解するのに苦労しているコードに出くわしました、そして誰かが私を説明してくれれば幸いですここにコードがありますこれは実際にはここにある実際のコードの非常に単純化されたバージョンです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;
}

つまり、ここでは、10行あり、各行が4x4行列であるelemStiff配列の値を初期化して入力します。

私にとって非常に奇妙なのは、コードがdouble ** A =elemStiff[i]の助けを借りてelemStiff配列のエントリを埋めることです。

私が最初に見たとき、それはエラーを与えるでしょうが、それは動作します!。Aに渡された値は、elemStiff配列で同時に渡されますが、なぜそれが機能するのかわかりません

ありがとうございました

4

1 に答える 1

3

より単純なバージョンから始めましょう:

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個の2次元配列の配列があります。

double ***elemStiff = new double**[10];

次にptr、私の簡単な例で使用したように、一時ポインターAを使用して、これらの10個の2次元配列のそれぞれを指すようにします。

for (i = 0; i < 10; i++)
    double **A = elemStiff[i];
于 2013-02-11T20:31:51.197 に答える