OKWAVEのAI「あい」が美容・健康の悩みに最適な回答をご提案!
-PR-
解決
済み

配列で行を取り出したい

  • 暇なときにでも
  • 質問No.214552
  • 閲覧数30
  • ありがとう数1
  • 気になる数0
  • 回答数4
  • コメント数0

お礼率 13% (5/36)

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}

にしたいのですが出来ますでしょうか?
通報する
  • 回答数4
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

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

  • 回答No.4
レベル13

ベストアンサー率 37% (419/1115)

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]の列の先頭を指している形になります。
解りにくかったら補足して下さい。
-PR-
-PR-

その他の回答 (全3件)

  • 回答No.1
レベル10

ベストアンサー率 23% (43/184)

宣言が 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]; のようにすれば全部代入されます。
宣言が

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];

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


  • 回答No.2
レベル13

ベストアンサー率 37% (419/1115)

こんなのもありですよ。 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の ...続きを読む
こんなのもありですよ。

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の配列ですので、この場合どちらかから値に変更が加わればもう片方から見ても変わります。
(同じものを参照しているのだから当たり前ですね)
お礼コメント
googlegoogle

お礼率 13% (5/36)

この場合
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:53
  • 回答No.3
レベル10

ベストアンサー率 23% (43/184)

> for(cnt=0;cnt<3;cnt++){ >   yy[cnt] = x[cnt]; > } > なぜこれでできるのですか?cntになにか特別な?ただのintですよね?(゜ρ゜) cntはただのintで別に特別なものではありません。 これはアクセスの方法の問題です。C言語の場合配列を表すように書くとその配列の先頭を指すポインタに変換されますよね。だから ...続きを読む
> 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] と同じです。つまり先頭アドレス。厳密にいうと型が違うしどんなコンパイラでも同じとは限らないんですが、だいたいは同じになると思います)。
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ