ポインタを使った暗黙的な型変換
この記事は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; } } }
ソースコードのダウンロード