IntPtr
是 C# 中的一个类型,用于表示一个指向非托管内存的指针。它主要用于与需要指针的非托管函数进行互操作,尤其是在使用 P/Invoke 调用 Win32 API 或其他非托管代码时。IntPtr
可以在 32 位和 64 位系统上工作,它的大小会根据平台自动调整(32 位平台上是 32 位,在 64 位平台上是 64 位)。
以下是一些 IntPtr
的常见用途:
P/Invoke: 当你需要从 C# 代码中调用非托管的 DLL 函数时,可以使用 IntPtr
来传递或接收指针参数。
[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
句柄: 在 Windows 编程中,经常需要处理各种类型的句柄,如窗口句柄、文件句柄等,这些通常都可以用 IntPtr
类型来表示。
IntPtr hwnd = FindWindow(null, "Notepad");
分配和释放非托管内存: 使用 Marshal
类的 AllocHGlobal
和 FreeHGlobal
方法可以分配和释放非托管内存,并返回一个 IntPtr
指向这块内存。
IntPtr ptr = Marshal.AllocHGlobal(100); // 分配100字节
try
{
// 使用ptr...
}
finally
{
Marshal.FreeHGlobal(ptr); // 释放内存
}
数据转换: 你可以将 IntPtr
转换为整数类型(例如 int
或 long
),但需要注意的是,在 64 位平台上,IntPtr
的大小为 64 位,因此可能无法安全地转换为 int
。通常建议使用 Int64
进行转换。
long value = (long)ptr;
IntPtr newPtr = (IntPtr)value;
作为方法参数: 当你定义的方法需要接受一个指针或者句柄时,可以使用 IntPtr
作为参数类型。
public void SomeMethod(IntPtr handle)
{
// 使用handle...
}
固定数组元素: 如果你需要将托管数组中的元素地址传递给非托管代码,可以使用 fixed
语句配合 IntPtr
来固定数组元素的位置。
int[] numbers = { 1, 2, 3, 4, 5 };
fixed (int* pNumbers = numbers)
{
IntPtr numbersPtr = (IntPtr)pNumbers;
// 将numbersPtr传递给非托管代码
}
注意:当使用 IntPtr
时,一定要小心管理资源,确保不会造成内存泄漏,并且正确地处理异常情况下的资源清理。
C# IntPtr转byte数组、byte[]转Intptr、IntPtr转byte[]、IntPtr转换为raw数据、Marshal.Copy方法-CSDN博客
C# 进行图像处理的几种方法(Bitmap,BitmapData,IntPtr)_c# bitmap-CSDN博客
C# byte[]、struct、intptr、byte[]和byte*等的相互转换_c# struct byte[]-CSDN博客