トップページ > プログラム > 2021年04月07日 > ODWVZMHP0

書き込み順位&時間帯一覧

13 位/159 ID中時間01234567891011121314151617181920212223Total
書き込み数0000000000000012000000003



使用した名前一覧書き込んだスレッド一覧
708 (ワッチョイ a348-ql7i)
★★Java質問・相談スレッド183★★

書き込みレス一覧

★★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)に対応すると考えました


※このページは、『2ちゃんねる』の書き込みを基に自動生成したものです。オリジナルはリンク先の2ちゃんねるの書き込みです。
※このサイトでオリジナルの書き込みについては対応できません。
※何か問題のある場合はメールをしてください。対応します。