>>166を図にしてみる
前者:インスタンスへの参照がコピーされて渡ってくる
【変数A】→→→ ┏━━━━━┓
┃インスタンス┃
【変数B】→→→ ┗━━━━━┛
↑この「参照」をコピーしている
例えば変数Bをnullにしても変数Aに影響はない
【変数A】→→→ ┏━━━━━┓
┃インスタンス┃
【変数B】 ┗━━━━━┛
↓
null
ただし変数Bを介してインスタンスを操作すれば、
そのインスタンスを参照している変数Aも影響を受ける
後者:インスタンスへの参照の参照が渡ってくる
【変数A】→→→ ┏━━━━━┓
↑ ┃インスタンス┃
【変数B】 ┗━━━━━┛
例えば変数Bをnullにしたら変数Aもnullになる
null
↑
【変数A】 ┏━━━━━┓
↑ ┃インスタンス┃
【変数B】 ┗━━━━━┛
変数Bを介してインスタンスを操作すれば、
そのインスタンスを参照している変数Aも影響を受ける
これはわかりやすい
| ∧ ∧
|/ ヽ ./ .∧
| `、 / ∧
|  ̄ ̄ ̄ ヽ
| ̄ ̄ ̄月曜日 ̄ ̄ ̄)
| ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄.\
|ヽ-=・=-′ ヽ-=・=- / やあ
|:: \___/ /
|::::::: \/ /
>>178で書いてることが全然理解できないんだけど俺の理解力がないだけ?
書きたいことはわかるんだけど
>変数Bを介してインスタンスを操作すれば、
>そのインスタンスを参照している変数Aも影響を受ける
変数Bのインスタンスって変数Aじゃないの?
素直に読めば当たり前のこと書いてるだけにしか読めないんだけど
変数B「そのもの」をnullにしたって変数Aに影響ないよね?
残念ながらGC噛ますオブジェクト指向言語では
インスタンスは直接扱いません
インスタンス変数=インスタンスへの参照を格納する変数 ってな
>>181 C++で言う参照とポインタの違いじゃないの?
もし変数Bが変数Aへのポインタなら変数Bをnullにしても何の影響もないけど
変数Bが変数Aの参照だったら変数Bを変えたら変数Aも変わる
参照って直接触れないポインタじゃねーの?
*(*p)参照の参照もこういう状態で
pそのものをいじる術がないってことでしょ?
あれ?なんか混乱してきた
俺が言いたいのはBを通してAの値を変えてるだけでBの値を変えてるんじゃないだろ?ってことだ
実はC++よく知らないから参照とポインタの違いは知らない
185 :
以下、名無しにかわりましてVIPがお送りします:2010/09/06(月) 01:06:52.34 ID:90n6Zs43P
参照はただのエイリアスで、ポインタは値をアドレスとして間接参照を行える変数
直接現物に触れるのが参照で、間接的に触れるのがポインタ
>>185 ありがとう
エイリアスってなんか聞いたことはあるけど今まですっかり頭の中から消えてた
参照はポインタ(みたいなもの)ってなんかで見たからすっかりポインタと同一物だと思ってたよ
でもそれなら上のrefのとき別名をコピーって意味わからなくない?
新しいインスタンス渡さなきゃrefじゃなくても参照渡しになるでしょ?
参照≒ポインタじゃないと不自然な気がするんだけど
ああ、改めて同名の別物の別名を作ったってことか
でその別名を変えたと
わかったようなわからないような感じだけど
挙動はわかるしまあよしとしよう
スレ汚し悪い
>>186 どうだろう?C#って普通の引数とかは参照渡しというよりポインタの値渡しに近いと思うんだが
そこら辺は名称がごちゃごちゃで分かり難いんだよね
refって使う場面あるのかねぇ
outなら使い所が分かるけど
>>188 実際の挙動レベルで参照とポインタがどう違うかわからないんだよなぁ
区別つくものなんだろうか
>>189 構造体には使ってるよ
クラスならrefじゃなくout使うべきっぽいな
まあコンパイラレベルだと同じように扱われるらしいけど
>>190 >実際の挙動レベルで参照とポインタがどう違うかわからないんだよなぁ
C/C++とかアセンブラの世界の話で、物凄く簡単に言うと、
例えばメモリ上のとあるアドレス、仮に A000H になんらかの値が格納されている時、
関数の外でも中でも A000H に触れるのがエイリアスというか参照で、ポインタは全然別物。
例えばメモリ上のとあるアドレス、B000H に A0 00 という値が格納されていて、このアドレスをポインタ変数と見た時、
B000H に格納されている値をアドレスに見立てて、その先に触れようとするのが
ポインタを使った間接アドレシングになるから、 両者は全然別物。
・・・ただ実際にコンパイラがどういう機械語を吐いてるのかまでは、実際にDisAssembleしないとわからないっていうか
その辺の実際の仕様までは詳しく知らない。 あと、C# での参照ってどんなんとかは、そもそも同じような用語使ってるだけで
全然別の内容になると思うので、なんとも言えない。 とりあえず両者の違いはそんな所
ちなみに細かい話なので混乱避ける為にあえてこんな書き方したけど
>B000H に A0 00 という値が格納されていて
Z80だと 00 A0 の順。っていうどうでもいい余談を追記
あとコンパイラの実際の吐き出しについて、パー速にレスあった。
719 名前:以下、VIPにかわりましてパー速民がお送りします[sage] 投稿日:2010/09/06(月) 01:53:58.13 ID:7qvENP2o
本スレ
>>190 C++の場合、最適化が関わってポインタと参照でコンパイル結果が全く違う可能性はなきにしもあらずだが、
最適化なしでコンパイルされたら、参照なのか、注意深く使用されたポインタなのかは区別できない
だそうだ。コンパイラの結果側の話として、って事
RPCのrefはマーシャラさんが凄いことをしていそう
>>193 これはつまり値が弄れるかどうかの違いしか現実問題としてないってことだよな?
>>191-192 ビックだかリトルだか忘れたけどそんなんだよな?
どっちがどっちか名前忘れたけど昔ちまちまゲーム弄ってたから知ってるぜw
なんか「参照型」を渡した時はポインタを渡したみたいな挙動で
「参照渡し」は普通に別名になってる気がする
要はC#キモイってことでおk?便利だから使うけど