値渡しと参照渡し

2022.07.10

メモリの概念

前提として変数の実態はメモリ番地である。

こちら参考

値渡し

メモリの中にある値をコピーしたものを使うこと。

実際の値を使っていない。

値渡しは以下のようになる。

def a(x, y)
 p x += 1
 p y += 1
end
x = 1
y = 10
a(x,y)
p x
p y

#=> 2
#=> 11
#=> 1    #変わってない
#=> 10   #変わってない

参照渡し

メモリの中にある値を使うこと。値が入っているメモリまでの参照(情報)を渡す。

実際の値を使っている。

rubyが参照渡しだと以下のようになる。

def a(x, y)
 p x += 1
 p y += 1
end
x = 1
y = 10
a(x,y)
p x
p y

#=> 2
#=> 11
#=> 2    #変わってる
#=> 11   #変わってる

参照の値渡し

rubyは値渡しなのだが参照を渡している。

参照の値渡しの例

def a(arr_2)
 p arr_2[0] += 1
end
arr = [1, 10]
a(arr)
p arr

#=> 2
#=> [2, 10]  #2のみ値が変わっている。  
  1. 実引数arrには[1,20]の番地情報が格納されている。
  2. 仮引数arr_2にはarrの値のコピーが渡される。値渡しが行われる。
  3. 実引数arrから仮引数arr_2に渡される値は参照。
  4. 値渡しで参照を渡している。

まとめ

値の渡し方によって値渡しをしたり参照渡しに変更したりできるものだと思っていたが全然違った。

  • 値渡しはメモリの中の値をコピーしたものを操作している
  • 参照渡しはメモリの番地情報を渡しているので実際の値を操作している
  • 参照の値渡しは『値渡しで参照が渡されている』という状態。なので値渡しだが実際の値を操作している