0

ダブルポインターを使用して 2D 配列を実装しようとしています。私が実装しようとしている方法は、物理的な表現に従って視覚化することです。たとえば、2 x 2 行列を考えてみます。その物理表現は次のとおりです。

     c1  c2

R1 -> A00 A01
R2 -> A10 A11

ステップ 1: 最初の行を指す double ポインターを作成する
ステップ 2: c1 のアドレスを指す第 1 レベル ポインターを作成する
ステップ 3: ユーザーからの入力 ステップ
4: c2 のアドレスを指す第 1 レベル ポインターを作成する
5: ユーザーからの入力
ステップ 6: 行ポインターをポイント R2 にインクリメントする
ステップ 7: ステップ 2 から 5 を繰り返す

以下は、私が実装したコードのコード スニペットです。

int _tmain(int argc, _TCHAR* argv[])
{
    int **p,***temp;
    p = (int **)malloc(nRows*sizeof(int *)); 
                                //Allocating memory for two rows, now p points to R1
    temp = &p;   //storing the address of p to restore it after storing the values
    for(int i=0;i<nRows;i++)
    {

        for(int j=0;j<nCols;j++)
        {
            *(p+j) = (int *)malloc(sizeof(int)); 
                                 //Allocating memory for col , now *p points to C1
            scanf("%d",*(p+j));
        }
        p += 1;     // NOw p is pointing to R2
    }

    p = *temp;          // restoring the base address in p;
    for(int i=0;i<nRows;i++)
    {
        for(int j=0;j<nCols;j++)
            printf("%d",*(p+j));
                   // In first iteration print values in R1 and R2 in second iteration
        p += 1;     // points to the next row
    }

    getch();
    return 0;
}

scanf は正常に動作しているようです。しかし、printf では不規則な結果が得られます。他の場所を指し始めます

前に言った方法でこの 2D 配列を実装する方法を教えてください。この演習は、ダブル ポインターの動作に関する詳細な知識を得るために、実験的な目的で行っています。

4

1 に答える 1

0

この行:

printf("%d",*(p+j));

実際には行へのポインターを出力しますj(p は行要素ではなく行を指しているため)。もう一度逆参照することで修正できます。

printf("%d",p[i][j]));

そして取り除く

 p += 1;

2 番目のループから。

また、コードは非常に読みにくいため***temp、1 行おきにポインターを回避して再割り当てするようにしてください。

于 2012-09-21T12:02:00.827 に答える