【C#】IntPtr的使用

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 类的 AllocHGlobalFreeHGlobal 方法可以分配和释放非托管内存,并返回一个 IntPtr 指向这块内存。

IntPtr ptr = Marshal.AllocHGlobal(100); // 分配100字节
try
{
    // 使用ptr...
}
finally
{
    Marshal.FreeHGlobal(ptr); // 释放内存
}

数据转换: 你可以将 IntPtr 转换为整数类型(例如 intlong),但需要注意的是,在 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方法-优快云博客

C# 进行图像处理的几种方法(Bitmap,BitmapData,IntPtr)_c# bitmap-优快云博客

C# byte[]、struct、intptr、byte[]和byte*等的相互转换_c# struct byte[]-优快云博客

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wangnaisheng

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值