プロが教える店舗&オフィスのセキュリティ対策術

x[3][3]={8,2,3},{5,2,5},{4,7,1}

x[0][0],x[0][1],x[0][2]を取り出し、yy[0]={8,2,3}
x[1][0],x[1][1],x[1][2]を取り出し、yy[1]={5,2,5}
x[2][0],x[2][1],x[2][2]を取り出し、yy[2]={4,7,1}

にしたいのですが出来ますでしょうか?

A 回答 (4件)

inetdさんから既に補足に対する回答がついておりますが、少しだけかみ砕いて説明してきます。



int *yy[3];

この宣言をご覧下さい。
yyはポインタの配列ですよね。
つまりyy[0]やyy[1]にはそれぞれintの領域のアドレスを格納出来ることになります。

次にこちらをご覧下さい。

int x[3][3]={{8,2,3},{5,2,5},{4,7,1}};

このような定義の時、例えばx[1][0]は5ですよね。
また、&x[1][0]はそのアドレスですよね。
と同時に、x[1]の配列の先頭アドレスでもあります。
そして、&x[1][0]はそのままx[1]とも書き換えられます。
つまりyy[cnt] = x[cnt]とは、例えばcntが1ならば、intのアドレスを格納する領域yy[1]にint型の配列の先頭アドレスであるx[1]を格納しているわけです。
図にすると、

yy[1]  x[1]
 □ → □□□

と言う具合にyy[1]がx[1]の列の先頭を指している形になります。
解りにくかったら補足して下さい。
    • good
    • 0

> for(cnt=0;cnt<3;cnt++){


>   yy[cnt] = x[cnt];
> }
> なぜこれでできるのですか?cntになにか特別な?ただのintですよね?(゜ρ゜)

cntはただのintで別に特別なものではありません。
これはアクセスの方法の問題です。C言語の場合配列を表すように書くとその配列の先頭を指すポインタに変換されますよね。だからできるんです。

たとえば int x[3]; の宣言なら x は配列を表しますが、式の右辺で x を使用すると &x と同じ値になります。同様に int x[3][3]; で x[1] とすると &x[1] と同じになります。(これは通常 &x[1][0] と同じです。つまり先頭アドレス。厳密にいうと型が違うしどんなコンパイラでも同じとは限らないんですが、だいたいは同じになると思います)。
    • good
    • 0

こんなのもありですよ。



int x[3][3]={{8,2,3},{5,2,5},{4,7,1}};
int *yy[3];
int cnt;

for(cnt=0;cnt<3;cnt++){
  yy[cnt] = x[cnt];
}

これ以降、yyはポインタ配列のままで参照することもできますし、二次元配列として参照することも可能です。
ただし、yyが参照しているのはxの配列ですので、この場合どちらかから値に変更が加わればもう片方から見ても変わります。
(同じものを参照しているのだから当たり前ですね)
    • good
    • 0
この回答へのお礼

この場合
yy[0]={8,2,3}となるんですね。
さらにyy[0][0]=8

C言語のポインタの章で同じような事が書かれてました。
ありがとうございました。ただ、
int x[3][3]={・・・・}
int *yy[3];
int i,j;
for(i=0;i<3;i++){
for(j=0;j<3;j++){
yy[i][j]=xx[i][j];
}
}
でyy[i]={8,2,3}なら理解できるのですが、

for(cnt=0;cnt<3;cnt++){
  yy[cnt] = x[cnt];
}
なぜこれでできるのですか?cntになにか特別な?ただのintですよね?(゜ρ゜)

お礼日時:2002/02/09 12:14

宣言が



int x[3][3] = {{8,2,3},{5,2,5},{4,7,1}};
int yy[3][3];

の場合は for ループを使って

int i, j;

for (i = 0; i < 3; i++)
 for (j = 0; j < 3; j++)
  yy[i][j] = x[i][j];

のようにすれば全部代入されます。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!