実際にどこでメモリが確保されるかを説明します。
ttt はグローバル変数なので 0 で初期化されます。
C++ なので ttt の値は nullptr です。
SettAAA(ttt); で関数 SetAAA を呼び出すとき、
引数である変数 aaa がメモリ上に確保されて、
そこに ttt の値である nullptr が格納されます。
aaa = new int; ですが、
new int で int のサイズの領域がメモリ上に確保されます。
この領域に変数名のような名前はありませんが、
メモリ上に領域が存在するので、そのアドレスはあります。
演算子 new はそのアドレスを値として返します。
その値の型は int * です。
aaa = により、aaa が持っていた nullptr は破壊され、
aaa には「new int で確保された領域のアドレス」が格納されます。
*aaa = 5; により、「new int で確保された領域」に 5 が格納されます。
関数 SetAAA から main に戻るとき、変数 aaa の領域は解放されます。
「new int で確保された領域」は解放されずに残っています。
ttt の値は nullptr のまま変わってはいないので、*ttt を参照すると失敗します。
SetBBB(&ttt); で関数 SetBBB を呼び出すとき、
引数である変数 bbb がメモリ上に確保されて、
そこに &ttt すなわち「ttt のアドレス」が格納されます。
*bbb = new int; ですが、
new int で int のサイズの領域がメモリ上に確保されます。
この領域に変数名のような名前はありませんが、
メモリ上に領域が存在するので、そのアドレスはあります。
演算子 new はそのアドレスを値として返します。
その値の型は int * です。
bbb の値は「ttt のアドレス」ですから、*bbb は変数 ttt です。
*bbb = により、ttt が持っていた nullptr は破壊され、
ttt には「new int で確保された領域のアドレス」が格納されます。
*bbb が変数 ttt なので、**bbb = 5; は *ttt = 5; と同じ意味になり、
「new int で確保された領域」に 5 が格納されます。
関数 SetBBB から main に戻るとき、変数 bbb の領域は解放されます。
「new int で確保された領域」は解放されずに残っています。
ttt の値は「new int で確保された領域のアドレス」なので、
*ttt の値は、「new int で確保された領域」の値 5 になります。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/09/28 00:36