@ゲー単走部

ローグライク雑記。変愚蛮怒、DCSSなど。

参照型変数の値渡しと参照渡しの違い

1.値型変数の値渡し 2.値型変数の参照渡し
3.参照型変数(ポインタ変数)の値渡し 4.参照型変数(ポインタ変数)の参照渡し

2と3が結果的に似たような挙動になるからといって、3のことを雑に参照渡しと呼んじゃうケースが多い気がする。
雑に説明するときはそれでいいのかもしれないが、後々混乱を招きそう。

using System.Collections.Generic;
using System;

class Test {
    
    public static void change(ref List<string> array) {
        array = new List<string>();
        array.Add("bbb");
    }

    public static void change2(List<string> array) {
        array = new List<string>();
        array.Add("aaa");
    }

    public static void change3(List<string> array) {
        array.Add("aaa");
    }
    
    public static void Main() {
        List<string> array = new List<string>();
        array.Add("hogehoge"); array.Add("foo");
        
        change(ref array);
     // change2(array);
     // change3(array);
        
        foreach (string str in array) {
            Console.WriteLine(str);
        }
    }
    
}

C#なんて全然触ったことないから、出鱈目な書き方してるかもしれない。とりあえず動きはしてる。

  • changeの方は参照型変数の参照渡しで、array:["hogehoge", "foo"] が初期化された後、"bbb"が追加され、array:["bbb"]となる。
  • change2の方は参照型変数の値渡しであり、メソッド内のarrayが色々変わるだけ。元のarray:["hogehoge", "foo"]は何も変わらない。
  • change3も参照型変数の値渡しであるが、この場合はきっちりarrayが["hogehoge", "foo", "aaa"]に変更される。


C言語でポインタを苦労して学んだからこういう挙動の違いもすんなり理解できてる気がする。
やっぱりC言語の勉強は大事なのでは?