• 締切済み

二次元配列とポインタについてよくわかりません

二次元配列の要素を代入しようと思って double *pa; for(i = 0; i < 4; i++){ for(j = 0; j < 4; j++){ printf("A[%d,%d]=", i + 1, j + 1 ); scanf("%lf", pa + i + j); printf("A[%d,%d]=%g\n", i + 1, j + 1, *(*(pa + i) + j) );}} とやっているのですがどうやらscanfで上手くいかず最後のprintfが表示されません あと double (*pb)[4]; printf("4 x 4 行列 Bの要素を入力してください>\n"); for(i = 0; i < 4; i++){ for(j = 0; j < 4; j++){ printf("B[%d,%d]=", i + 1, j + 1 ); scanf("%lf", &pb[i][j]);}} もうまくいきません (二通りの方法でしなければ成らないので) どうしたらいいでしょうか?

みんなの回答

  • yatokesa
  • ベストアンサー率40% (201/496)
回答No.2

まず、double *pa はちゃんと領域が確保されていますか? --- >scanf("%lf", pa + i + j); これではうまくいきませんね。pa + (i * 4) + j としなければ 4x4の配列のようには格納できません。 >*(*(pa + i) + j) これは全然違うところを見に行ってしまいます。上で書いたようなアドレス計算をした上で * を付けて参照してください。 --- *pb[4] の各配列に 4つ分の doubleの領域はありますか? --- >scanf("%lf", &pb[i][j]); こちらはうまく行きそうですけど...。(pb[n]に領域がちゃんとある場合)。printf で失敗している可能性もあります。

  • kary
  • ベストアンサー率55% (10/18)
回答No.1

こんにちは。 まず、double *paとdouble(*pa)[4]ともポインタの宣言のみがされていて配列は宣言されていないのでうまくいかないのだと思います。宣言の部分を、 double X[4][4]; /*配列の宣言*/ double (*pa)[4] = X; /*ポインタに代入*/ のようにする必要があります。下の場合はこれでうまく動くと思いますが、上の場合はscanfのところで scanf("%lf", (*(pa+i)+j)); とする必要があると思います。 (私はポインタ演算について分からない部分が多くて、普段はなるべく使わないようにしているので間違っているかも知れませんが...)