以下のようにStringのポインタアドレスを取得します

var str = "test";
var handle = GCHandle.Alloc(str, GCHandleType.Pinned);
var ptr = handle.AddrOfPinnedObject();
Console.WriteLine("0x{0}", ptr.ToString("x8"));

このポインタ自体を置き換えるにはどうしたら良いのでしょうか?
ポインタを書き換える という表現が正しいのかは分かりませんが、例えば

static void Test(ref string str)
{
    str = "changed";
}

このようなstringを参照として渡す関数を用意し、値を変更した場合
書き換える前と後とでポインターアドレスが違います。
この、ポインタを参照するポインタに新しいアドレスを設定したいのです。

正確なことは分かりませんが、私の推測ではC#のstring型には

  • 文字列の長さ情報を格納するアドレスを示すポインタ
  • 文字列の値情報を格納するアドレスを示すポインタ

が有り、AddrOfPinnedObjectが返すポインタは後者の

  • 文字列の値情報を格納するアドレスを示すポインタ

であると推測します。
そこで、文字列の値情報を格納するアドレスを示すポインタのポインタを取得し、
強引にポインタ自体を置き換える方法を探しています。

以上、よろしくお願いします。