質問: 1; printf("配列aの2つ目の要素は%d、番地は%pです\n", a[1], &a[1]); printf("配列bの2つ目の要素は%d、番地は%pです\n", b[1], &b[1]); printf("\n"); } ``` 「出力結果」 配列aの2つ目の要素は20、番地は0x7ffedfc58954です 配列bの2つ目の要素は20、番地は0x7ffedfc58944です 配列aの2つ目の要素を1に変更する 配列aの2つ目の要素は1、番地は0x7ffedfc58954です 配列bの2つ目の要素は20、番地は0x7ffedfc58944です 私は、浅いコピーはコピー元の要素を変えるとコピー先の要素も変わってしまうと解釈していたのですが、やはり解釈自体に問題があったのでしょうか? アバウトな質問となってしまい申し訳ありません。
回答: (回答にならない感) 「浅い」「深い」という言葉を知っておくことは大切かもしれませんが,そういった言葉に振り回されるよりも前に, `memcpy(b, a, 16);`によって,あなたが「何をコピーしたのか」を把握することの方が重要です. `memcpy(b, a, 16);`自体は,「aが指す位置から16バイト分の内容をbが指す位置にコピー」することでしかないわけで, 「aが指す位置から16バイト分の内容」ってのは実際には(そのプログラムにおいては)何なのか,それはどのような性質のものなのか,という側の理解が(浅いとか深いとか言い出すよりも前に**前提知識として**)先に必要です. それがわかってさえいれば,コピー元とコピー先の関係性は自明であり,「memcpyとさえ書けばコピー先とコピー元とに変な関係が結ばれる...?」みたいな誤解をすることはないハズです. (ちょいと「ポインタとは」的な復習をされると良いのではないかな,と)