たかやまのプログラミング

プログラミング中心のブログです。

ポインタを使った暗黙的な型変換

takym.code.blog


この記事はhttps://takymsystems.blog.fc2.com/blog-entry-61.htmlに転載しました。
ポインタを使ってメモリにアクセスできるので、暗黙的に型を別の型に変換できるのではないかと思いましたのでC#で試してみました。
(※ポインタを使うには '/unsafe' でコンパイルする必要があります。)


Program.cs

using System;

namespace MemoryTest
{
    // ポインタにするためアンセーフにする。
    static unsafe class Program
    {
        static void Main(string[] args)
        {
            // ポインタを使う変数。
            Target tc = new Target();
            // tc のポインタ。
            Target* tc_pointer = &tc;
            // 値を代入する。
            tc_pointer->number1 = 0x12345678;
            tc_pointer->number2 = 0x00ABCDEF;
            // tc と同じアドレスで、LongTarget型のポインタを作る。
            LongTarget* lt_pointer = ((LongTarget*)(tc_pointer));

            // 結果の表示
            Console.WriteLine("アドレス:0x{0:X}", new IntPtr(tc_pointer));
            Console.WriteLine("number1=0x{0:X}", tc.number1);
            Console.WriteLine("number2=0x{0:X}", tc.number2);
            Console.WriteLine("number3=0x{0:X}", lt_pointer->number3);
        }

        // ターゲットの型。
        // 値型でなければいけない。(フィールドも。)
        struct Target
        {
            public uint number1;
            public uint number2;
        }

        // ターゲットの型。
        struct LongTarget
        {
            public ulong number3;
        }
    }
}



ソースコードのダウンロード