- ★★Java質問・相談スレッド183★★
738 :708 (ワッチョイ a348-ql7i)[sage]:2021/04/07(水) 14:59:25.85 ID:ODWVZMHP0 - 共有渡しなどでググってみましたがまだ理解できません
比較のためC++の例を。こっちが頭にあるから混乱してたのかもしれない #include <stdio.h> struct T{ int a; T(int i){a=i;}}; T f(T a){ return a;} int main(){ T a(10); T b=f(a); //javaと違ってbのアドレスは変わる。ここの挙動がjavaの疑問点 T c = a; //これもjavaと違って新しいコピーが作られる。コピコン T* d = &a; //ポインタ。同じアドレスをさす T& e = a; //参照。同じアドレスをさす printf("%d\n%d\n%d\n%d\n%d\n",&a,&b,&c,d,&e); return 0; } 実行結果 286472060 286472064 286472068 286472060 286472060
| - ★★Java質問・相談スレッド183★★
739 :708 (ワッチョイ a348-ql7i)[sage]:2021/04/07(水) 15:17:30.71 ID:ODWVZMHP0 - 追記。javaと比較しやすいように参照渡しの関数を追加しました
#include <stdio.h> struct T{ int a; T(int i){a=i;} }; T f(T a){ return a; } T& g(T& a){return a;} //前のコードに追加したコード int main(){ T a(10); T b=f(a); T c = a; T* d = &a; T& e = a; T& f = g(a); //参照渡し。同じアドレスをさす。前のコードとの違いはここ printf("%d\n%d\n%d\n%d\n%d\n%d\n",&a,&b,&c,d,&e,&f); return 0; } 実行結果 1519342484 1519342488 1519342492 1519342484 1519342484 1519342484
| - ★★Java質問・相談スレッド183★★
740 :708 (ワッチョイ a348-ql7i)[sage]:2021/04/07(水) 15:33:40.19 ID:ODWVZMHP0 - c++風な理解ですがjavaの共有渡しは
実引数a 値アドレス10 アドレス100 仮引数a 値アドレス10 アドレス101 と言う風に準備されて 仮引数に代入してもアドレス101に代入されるので実引数のアドレス100には影響が無い 値アドレスは一緒なのでa.a=7などと代入すると実引数の値も変化する こういう理解だったのですがjava的には違うのでしょうか 最初のコードでT c=f(a)としたときにcとaのアドレスが変わらないということは C++版での参照渡しのコード(関数g)に対応すると考えました
|
|