- 締切済み
配列とポインタ
a1とa2が同じ型の配列で a1=a2; こうするとハードリンクみたいになりますか? この後、a1を変更するとa2の内容も変わってしまいますよね? b1とb2が同じ型の配列で b1[4]=b2[5]; や b1[4][7]=b2[5][0]; をするとディープコピーみたいになりますか? 多次元配列のディープコピーは、1次元目をループさせて b1[0]=b2[0]; b1[1]=b2[1]; ... こうするだけでよいですよね? この後、b1を変更してもb2の内容も変わらないですよね?
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- Tacosan
- ベストアンサー率23% (3656/15482)
「言いたい内容が伝わらない」というのは, 「#2 で私の書いた文章の意味が分からない」ということですか? もしそうなら, 「どこが分からないのか」を書いてくれれば答えますよ. たとえば 「a1 そのもの」を変更しても, その変更が a2 に影響することはありません. というのは, int[] a1, a2; a2 = new int[5]{1, 2, 3, 4, 5}; a1 = a2; a1 = new int[3]{10, 100, 1000}; としても a2 は変わらないということです. まさに「a1 そのもの」を変更していますよね. そうでなく, 「あなたの書いた文章の意味を私が理解できていない」ということであれば, 私はあなたの書いた文章の意味を把握すべく (最低限) 必要なことを聞いてもいるつもりです. まあ確かに「配列とポインタ」とあれば C と思うのもむべなるかなではあります>#3. そこについては完全に同意.
- aigaion
- ベストアンサー率47% (287/608)
あぁ、Javaですか・・・ 内容的にC言語だと勝手に勘違いしてました。 Javaの型は基本型と参照型に分けることができます。 基本型はintやdoubleなどです。 基本型の変数の代入はディープコピーになります。(暗黙の型変換が行われない場合のみ) 参照型は、クラス・インターフェイス・配列型です。 参照型変数の代入はすべてシャローコピーとなります。 基本型と参照型の区別さえしっかりできるようになればコピーがどちらなのかは用意にわかるようになります。 一番複雑な例は質問者さんが悩んでいるような配列の例です。 ポイントは ・配列変数から配列変数へのコピーはシャローコピーとなる。 ・何が配列変数なのかをしっかり理解すること。 この2つを理解することです。 >こうするとハードリンクみたいになりますか? この場合は配列変数a1に配列変数a2を代入しているのでシャローコピーとなります。 実体をコピーするのではなく別名を作るだけになります。 >ディープコピーみたいになりますか? なりません。 2次元配列というのは「配列を要素とする配列」です。 多次元配列になっても同様で、例えばN次元配列は「N - 1次元配列を要素とする配列」です。 ですから、b1を3次元以上の配列とするならb1[4]やb1[4][7]も配列型変数ですので、その代入もシャローコピーとなります。 例えば次のb3のようなint型の2次元配列を宣言したとします。 int [][] b3 = new int[2][3]; このb3で言えば b3[2][3] は int型、b3[2] は int[] 型ということです。 b3は int[]型の変数の配列 (int[])[]型変数と考えます。 仮にディープコピーを実現したいのであれcloneメソッドを使います。 次の例は2次元配列の場合です。 ///////////////////////////////// int[][] b1 = new int[2][3]; int[][] b2 = new int[2][3]; for(int i = 0; i < 2; i++){ b1[i] = b2[i].clone(); } ///////////////////////////////// cloneメソッドは配列の場合は1次元配列にしか使えません。 b1 = b2.clone(); というようなことはできません。
- Tacosan
- ベストアンサー率23% (3656/15482)
えぇと, ここは「Java」のカテゴリなので Java として話をしないとだめなのではないかと>#1. さておき, あなたのいう「ハードリンク」とはなんですか? この文脈において一般的な表現ではないと思うので補足をお願いします. また, 「a1 を変更する」とはどのような意味でしょうか. 「a1 そのもの」を変更しても, その変更が a2 に影響することはありません. あと, 「1次元目をループさせる」だけでディープコピーになることはありません. というか, それでディープコピーになるんだったら「ただの 1次元配列」でもコピーするだけでディープコピーになるはずでしょ? ここも「ディープコピー」の意味を確認しておいたほうがいいですか?
- aigaion
- ベストアンサー率47% (287/608)
>こうするとハードリンクみたいになりますか? なりません。 C言語では配列型の変数に代入を行うことは出来ません。 そのような操作を行う場合はポインタを使用します。 //配列型への代入 char a1[10], a2[10]; a1=a2; //こちらは可能 char *a1, a2[10]; a1=a2; >ディープコピーみたいになりますか? 上で書いたように配列型の変数への代入はできないのでなりません。 ポインタを介して行ったとしてもそれはシャローコピーです。 C言語の配列のディープコピーはそれぞれの要素を1つ1つコピーする必要があります。