• ベストアンサー

1次元配列と2次元配列のアドレスについて

2次元a[2][3]と同じ分の1次元配列b[2*3]を確保して、常に a[0][0]=b[0] a[0][1]=b[1] a[0][2]=b[2] a[1][0]=b[3] a[1][1]=b[4] a[1][2]=b[5] となるようにしたいです。 たとえば、a[0][0]=100;としたら一緒にb[0]=100になるような状態です。 自分ではそれぞれ同じアドレスを参照するようにすればできると思ったんですが、その方法がわかりません。 ためしに、 int a[2][3],b[2*3]; を宣言して a=b;としてみたり、 for(i=0;i<2;i++){ for(j=0;j<3;j++){ &a[i][j]=&b[j+i*3]; } } などやってみたのですが、これだとエラーがでてしまいどうしたらいいかわかりません。 どうしたら出来るのかアドバイスお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
noname#15691
noname#15691
回答No.3

> aのほうをポインタにしたときのやり方も教えてもらえないでしょうか。 int (*a)[3]; int b[6]; int i, j; a = (int (*)[3])b; b[0] = 0; b[1] = 1; b[2] = 2; b[3] = 3; b[4] = 4; b[5] = 5; for(i = 0; i < 2; i++) for(j = 0; j < 3; j++) printf("%d\n", a[i][j]);

その他の回答 (4)

回答No.5

> aのほうをポインタにしたときのやり方も教えてもらえないでしょうか。 #include <stdio.h> int main(void) {  int (*a)[3][3];  int b[9]={1,2,3,4,5,6,7,8,9};  int i, j;  a = (int (*)[3][3])b;  for(i = 0; i < 3; i++) {   for(j = 0; j < 3; j++) {    printf("%d\n", (*a)[i][j]);   }  }  return 0; }

sin11
質問者

お礼

みなさんありがとうございました。 どの方法でも希望どおりのことができました。 もっとポインタや共用体について勉強したいと思います。

  • mssine
  • ベストアンサー率24% (38/156)
回答No.4

#1様が書いているように、union使えば簡単ですよ。 ポインタの勉強のためならいいですが。。。 ただ、unionの場合、サイズが違っちゃうと面倒ですが。。 int i; union{ int a[2][3]; int b[6]; }a; memset(&a,0,sizeof(a)); a.a[0][2]=4; for(i=0;i<6;i++) printf("b[%d]=%d\n",i,a.b[i]);

回答No.2

> aのほうをポインタにしたときのやり方も教えてもらえないでしょうか。 int b[9] = [ .... }; int* a[3]; a[0] = &b[0]; a[1] = &b[3]; a[2] = &b[6];

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

int a[2][3],b[2*3]; としたら、とちらも、別のメモリなので、質問文のような同一メモリを参照するようなことはできません。 そういう場合は、どちらか一方(例えばbの方)をポインタにします。ポインタは参照する時に配列を使う場合と同じように参照できるので、概ね、希望の動作になると思います。 (あるいは、共用体(union)を使う方法もあるかもしれませんけど) サンプル #include <stdio.h> void main(void){ int a[2][3]; int *b; int i,j; a[0][0]=100; a[0][1]=101; a[0][2]=102; a[1][0]=103; a[1][1]=104; a[1][2]=105; for(i=0;i<2;i++) for(j=0;j<3;j++) printf("a[%d][%d]=%d\n",i,j,a[i][j]);/* aに入れたものを */ for(b=(int*)a,i=0;i<2*3;i++) /* bで参照できる */ printf("b[%d]=%d\n",i,b[i]); }

sin11
質問者

お礼

回答ありがとうございます。 とても参考になりました。 よろしければ、aのほうをポインタにしたときのやり方も教えてもらえないでしょうか。 試してはみたんですが、うまくいきません。