• ベストアンサー

配列

適当な記述ですが、次を見てください。 void roll(int *c) { int n, b2[8]; if(t<3) { for(n=0; n<8; n++) b2[n]=c[n]; for(n=0; n<8; n++) c[b2[n]]=7-n; for(n=0; n<8; n++) printf("%d",c[n]); printf("\n"); t++; roll(c); } else t=0; } int main() { int b[]={3,6,4,0,7,2,5,1}; roll(b); for(n=0; n<8; n++) printf("%d",b[n]); //36407251が表示されるようにしたい。 return(0); } rollが何の関数かは省略しますが、rollにmainのb(ポインタ?)を渡し、ある処理をして,それでmainに戻ってきた時にb[]を表示すると、36407251が表示されません。 ポインタを引数にするってことはポインタでさしてるとこをrollで操作してるわけですよね? そうすれば変わって当然だとはおもいます。 でも関数1で関数2に配列1を渡し、その関数2の中でで配列1の値が変化しても、元の関数1にもどれば配列1のまま変化していないようにするにはどうすればいいですか? やはり もう1つ配列を用意しなきゃだめなのでしょうか。

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

  • ベストアンサー
  • liar_adan
  • ベストアンサー率48% (730/1515)
回答No.1

>やはり もう1つ配列を用意しなきゃだめなのでしょうか。 そうですね。 これは単独の変数と配列の違うところで、 変数を関数間で受け渡しするときは、コピーして渡されますが、 配列を渡そうとするとそのポインタが渡されます。 この場合、構造体でくるむテクニックがあります。 typedef struct { int a[8]; }Data; とやって、(これでよかったかな) Data a, b; a = b; とやれば、コピーされるし、 関数に渡すときも普通の変数と同様になります。

rousei
質問者

お礼

ありがとうございます^^

その他の回答 (2)

  • ngsvx
  • ベストアンサー率49% (157/315)
回答No.3

#2の方も書いてらっしゃいますが、 roll関数では、b2はcをコピーしただけですね。 それなら、b2とcを入れ替えたらよいのでは? c[b2[n]]=7-n; を b2[c[n]]=7-n; のように。 rollの呼び出し側で、処理結果が必要だというのであれば、 rollの引数を2つ(入力用と出力用)にするか、 呼び出し側で配列のバックアップをとっておくか、 だと思います。

rousei
質問者

お礼

ありがとうございました^^

  • bikkuri
  • ベストアンサー率33% (23/68)
回答No.2

普通はもう一つ配列を用意して、中身をコピーしてから 使う必要がありますね。 構造体で定義するのも手ですが、単純にmemcpyでもOKかとおもいます。 roll関数の中で、 int cc[8]; memcpy(cc, c, sizeof(cc)); とし、以後、cの代りにccを使う ただ、この例では配列b2はcの内容をコピー後、変化していませんね。 この辺でなんとかなる気もしますが。

rousei
質問者

お礼

ありがとうございます^^

関連するQ&A