- ベストアンサー
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]; } } などやってみたのですが、これだとエラーがでてしまいどうしたらいいかわかりません。 どうしたら出来るのかアドバイスお願いします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
> 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)
- JaritenCat
- ベストアンサー率37% (122/322)
> 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; }
- mssine
- ベストアンサー率24% (38/156)
#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]);
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
> aのほうをポインタにしたときのやり方も教えてもらえないでしょうか。 int b[9] = [ .... }; int* a[3]; a[0] = &b[0]; a[1] = &b[3]; a[2] = &b[6];
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
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]); }
お礼
回答ありがとうございます。 とても参考になりました。 よろしければ、aのほうをポインタにしたときのやり方も教えてもらえないでしょうか。 試してはみたんですが、うまくいきません。
お礼
みなさんありがとうございました。 どの方法でも希望どおりのことができました。 もっとポインタや共用体について勉強したいと思います。