指针

int* p1, p2, p3;

不安全代码(unsafe)

当一个代码块使用 unsafe 修饰符标记时,C# 允许在函数中使用指针变量。不安全代码或非托管代码是指使用了指针变量的代码块。使用unsafe时,需要设置unsafe编译选项。代码中需要使用unsafe块,或者使用unsafe修饰符标记整个函数为不安全代码。

static public unsafe void unsafeTest()
{
    int var = 20;
    int* p = &var;
    Console.WriteLine("{0}", var);
    Console.WriteLine("{0}", *p);
    Console.WriteLine("{0}", (int)p);
}

unsafe
{
    int var = 20;
    int* p = &var;
    Console.WriteLine("{0}", var);
    Console.WriteLine("{0}", *p);
    Console.WriteLine("{0}", (int)p);
}

日志文件夹

Marshal

提供了一个方法集合,这些方法用于分配非托管内存、复制非托管内存块、将托管类型转换为非托管类型,此外还提供了在与非托管代码交互时使用的其他杂项方法。

Marshal.StringToHGlobalAnsi(String)

将托管 String 的内容复制到非托管内存,并在复制时转换为 ANSI 格式。返回这个字符串的IntPtr类型指针。

Marshal.AllocHGlobal(Int32)

从进程的非托管内存中分配内存。通过使用指定的字节数,从进程的非托管内存中分配内存。返回新分配的IntPtr类型的内存指针。

Marshal.FreeHGlobal(IntPtr)

释放以前从进程的非托管内存中分配的内存。

Marshal.PtrToStringAnsi(IntPtr)

分配托管 String,并向其复制所有或部分非托管 ANSI(适用于 Windows)或 UTF-8(适用于 Unix)字符串。返回string类型。

IntPtr 结构

表示一个有符号整数,其中位宽度与指针相同。

构造函数 IntPtr(Void*)

IntPtr.ToPointer()

将此实例的值转换为指向未指定类型的指针。返回Void*。

string stringA = "I seem to be turned around!";
IntPtr sptr = Marshal.StringToHGlobalAnsi(stringA);
byte* src = (byte*)sptr.ToPointer();