プログラミングしようず

このエントリーをはてなブックマークに追加
177以下、名無しにかわりましてVIPがお送りします
>>166を図にしてみる

前者:インスタンスへの参照がコピーされて渡ってくる

【変数A】→→→ ┏━━━━━┓
            ┃インスタンス┃
【変数B】→→→ ┗━━━━━┛
      ↑この「参照」をコピーしている

例えば変数Bをnullにしても変数Aに影響はない

【変数A】→→→ ┏━━━━━┓
           ┃インスタンス┃
【変数B】     ┗━━━━━┛
  ↓
  null

ただし変数Bを介してインスタンスを操作すれば、
そのインスタンスを参照している変数Aも影響を受ける
178以下、名無しにかわりましてVIPがお送りします:2010/09/06(月) 00:24:52.00 ID:rQymGKRU0
後者:インスタンスへの参照の参照が渡ってくる

【変数A】→→→ ┏━━━━━┓
  ↑         ┃インスタンス┃
【変数B】     ┗━━━━━┛

例えば変数Bをnullにしたら変数Aもnullになる

  null
  ↑
【変数A】    ┏━━━━━┓
  ↑      ┃インスタンス┃
【変数B】    ┗━━━━━┛

変数Bを介してインスタンスを操作すれば、
そのインスタンスを参照している変数Aも影響を受ける
179以下、名無しにかわりましてVIPがお送りします:2010/09/06(月) 00:26:39.63 ID:K0j58VEwP
これはわかりやすい
180以下、名無しにかわりましてVIPがお送りします:2010/09/06(月) 00:30:28.90 ID:CNehZ6ki0

| ∧         ∧
|/ ヽ        ./ .∧
|   `、     /   ∧
|      ̄ ̄ ̄    ヽ
| ̄ ̄ ̄月曜日 ̄ ̄ ̄)
| ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄.\
|ヽ-=・=-′ ヽ-=・=-  /   やあ
|::    \___/    /
|:::::::    \/     /
181以下、名無しにかわりましてVIPがお送りします:2010/09/06(月) 00:45:12.10 ID:rgy8j/850
>>178で書いてることが全然理解できないんだけど俺の理解力がないだけ?
書きたいことはわかるんだけど
>変数Bを介してインスタンスを操作すれば、
>そのインスタンスを参照している変数Aも影響を受ける
変数Bのインスタンスって変数Aじゃないの?
素直に読めば当たり前のこと書いてるだけにしか読めないんだけど
変数B「そのもの」をnullにしたって変数Aに影響ないよね?
182以下、名無しにかわりましてVIPがお送りします:2010/09/06(月) 00:49:15.46 ID:LSgk/MzM0
残念ながらGC噛ますオブジェクト指向言語では
インスタンスは直接扱いません

インスタンス変数=インスタンスへの参照を格納する変数 ってな
183以下、名無しにかわりましてVIPがお送りします:2010/09/06(月) 00:54:30.58 ID:CNehZ6ki0
>>181
C++で言う参照とポインタの違いじゃないの?
もし変数Bが変数Aへのポインタなら変数Bをnullにしても何の影響もないけど
変数Bが変数Aの参照だったら変数Bを変えたら変数Aも変わる
184以下、名無しにかわりましてVIPがお送りします:2010/09/06(月) 01:05:15.18 ID:6akyKocq0
参照って直接触れないポインタじゃねーの?
*(*p)参照の参照もこういう状態で
pそのものをいじる術がないってことでしょ?
あれ?なんか混乱してきた
俺が言いたいのはBを通してAの値を変えてるだけでBの値を変えてるんじゃないだろ?ってことだ
実はC++よく知らないから参照とポインタの違いは知らない
185以下、名無しにかわりましてVIPがお送りします:2010/09/06(月) 01:06:52.34 ID:90n6Zs43P
参照はただのエイリアスで、ポインタは値をアドレスとして間接参照を行える変数
直接現物に触れるのが参照で、間接的に触れるのがポインタ
186以下、名無しにかわりましてVIPがお送りします:2010/09/06(月) 01:12:00.24 ID:rgy8j/850
>>185
ありがとう
エイリアスってなんか聞いたことはあるけど今まですっかり頭の中から消えてた
参照はポインタ(みたいなもの)ってなんかで見たからすっかりポインタと同一物だと思ってたよ

でもそれなら上のrefのとき別名をコピーって意味わからなくない?
新しいインスタンス渡さなきゃrefじゃなくても参照渡しになるでしょ?
参照≒ポインタじゃないと不自然な気がするんだけど
187以下、名無しにかわりましてVIPがお送りします:2010/09/06(月) 01:15:42.61 ID:6akyKocq0
ああ、改めて同名の別物の別名を作ったってことか
でその別名を変えたと
わかったようなわからないような感じだけど
挙動はわかるしまあよしとしよう

スレ汚し悪い
188以下、名無しにかわりましてVIPがお送りします:2010/09/06(月) 01:23:31.69 ID:CNehZ6ki0
>>186
どうだろう?C#って普通の引数とかは参照渡しというよりポインタの値渡しに近いと思うんだが
そこら辺は名称がごちゃごちゃで分かり難いんだよね
189以下、名無しにかわりましてVIPがお送りします:2010/09/06(月) 01:40:54.42 ID:LSgk/MzM0
refって使う場面あるのかねぇ
outなら使い所が分かるけど
190以下、名無しにかわりましてVIPがお送りします:2010/09/06(月) 01:46:27.19 ID:rgy8j/850
>>188
実際の挙動レベルで参照とポインタがどう違うかわからないんだよなぁ
区別つくものなんだろうか

>>189
構造体には使ってるよ
クラスならrefじゃなくout使うべきっぽいな
まあコンパイラレベルだと同じように扱われるらしいけど
191以下、名無しにかわりましてVIPがお送りします:2010/09/06(月) 02:09:10.10 ID:90n6Zs43P
>>190
>実際の挙動レベルで参照とポインタがどう違うかわからないんだよなぁ
C/C++とかアセンブラの世界の話で、物凄く簡単に言うと、
例えばメモリ上のとあるアドレス、仮に A000H になんらかの値が格納されている時、
関数の外でも中でも A000H に触れるのがエイリアスというか参照で、ポインタは全然別物。

例えばメモリ上のとあるアドレス、B000H に A0 00 という値が格納されていて、このアドレスをポインタ変数と見た時、
B000H に格納されている値をアドレスに見立てて、その先に触れようとするのが
ポインタを使った間接アドレシングになるから、 両者は全然別物。

・・・ただ実際にコンパイラがどういう機械語を吐いてるのかまでは、実際にDisAssembleしないとわからないっていうか
その辺の実際の仕様までは詳しく知らない。 あと、C# での参照ってどんなんとかは、そもそも同じような用語使ってるだけで
全然別の内容になると思うので、なんとも言えない。 とりあえず両者の違いはそんな所

192以下、名無しにかわりましてVIPがお送りします:2010/09/06(月) 02:10:51.95 ID:90n6Zs43P
ちなみに細かい話なので混乱避ける為にあえてこんな書き方したけど
>B000H に A0 00 という値が格納されていて
Z80だと 00 A0 の順。っていうどうでもいい余談を追記
193以下、名無しにかわりましてVIPがお送りします:2010/09/06(月) 02:15:38.32 ID:90n6Zs43P
あとコンパイラの実際の吐き出しについて、パー速にレスあった。

719 名前:以下、VIPにかわりましてパー速民がお送りします[sage] 投稿日:2010/09/06(月) 01:53:58.13 ID:7qvENP2o
本スレ>>190
C++の場合、最適化が関わってポインタと参照でコンパイル結果が全く違う可能性はなきにしもあらずだが、
最適化なしでコンパイルされたら、参照なのか、注意深く使用されたポインタなのかは区別できない

だそうだ。コンパイラの結果側の話として、って事
194以下、名無しにかわりましてVIPがお送りします:2010/09/06(月) 02:22:45.40 ID:LSgk/MzM0
RPCのrefはマーシャラさんが凄いことをしていそう
195以下、名無しにかわりましてVIPがお送りします:2010/09/06(月) 02:24:34.32 ID:6akyKocq0
>>193
これはつまり値が弄れるかどうかの違いしか現実問題としてないってことだよな?

>>191-192
ビックだかリトルだか忘れたけどそんなんだよな?
どっちがどっちか名前忘れたけど昔ちまちまゲーム弄ってたから知ってるぜw

なんか「参照型」を渡した時はポインタを渡したみたいな挙動で
「参照渡し」は普通に別名になってる気がする
要はC#キモイってことでおk?便利だから使うけど