C#中使用指针

本文介绍了如何在C#中使用`unsafe`修饰符创建并操作数组指针,使用`fixed`语句锁定内存,确保数组在固定位置,以便于访问和调试。
部署运行你感兴趣的模型镜像
using UnityEngine;

public class NewBehaviourScript : MonoBehaviour
{
    int[] iArray = new int[10] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    void Start()
    {

        Method();
    }
    unsafe void Method()
    {
        fixed (int* ptr = &iArray[0])
        {
            for (int i = 0; i < iArray.Length; i++)
            {
                Debug.Log(*(ptr + i));//值
                //Debug.Log((int)(ptr + i));//地址
            } 
        }
    }
}

当一个代码块使用 unsafe 修饰符标记时,C# 允许在函数中使用指针变量。不安全代码或非托管代码是指使用了指针变量的代码块。

fixed 语句可防止垃圾回收器重新定位可移动的变量。 fixed 语句仅允许存在于不安全的上下文中。 因此在fixed(...){...}里数据的内存位置不会被改变,这样就可用指针来取数组中的值;

注:Debug.Log(*(ptr + i));中的+i的值指的是 指针移动当前指针类型的大小。指针类型为int、i=1时指针会移动4个字节;指针类型为byte、i=1时会移动1个字节的位置。

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

C#中,指针是一种用于直接访问内存地址的变量类型。使用指针可以提供对内存的更底层控制,这在某些情况下可以提高性能或实现某些特定的功能。然而,由于指针操作可能导致程序崩溃、数据损坏或其他安全问题,因此在使用指针时需要格外小心。 以下是关于C#使用指针的一些基本介绍: ### 1. 声明和使用指针C#中,可以使用`unsafe`关键字来声明一个不安全的上下文,从而允许在该上下文中使用指针。例如: ```csharp unsafe { int x = 10; int* p = &x; // 获取变量x的地址 Console.WriteLine(*p); // 输出变量x的值,即10 } ``` ### 2. 固定语句(fixed) 为了确保垃圾回收器不会移动对象,可以使用`fixed`语句将对象的地址固定下来。这对于需要将托管对象的地址传递给非托管代码时非常有用。例如: ```csharp unsafe { int[] arr = new int[5] { 1, 2, 3, 4, 5 }; fixed (int* p = arr) { for (int i = 0; i < arr.Length; i++) { Console.WriteLine(p[i]); // 输出数组元素 } } } ``` ### 3. 指针运算 在C#中,指针支持基本的算术运算,如加法和减法,但不支持其他复杂的指针运算。例如: ```csharp unsafe { int[] arr = new int[5] { 1, 2, 3, 4, 5 }; fixed (int* p = arr) { int* q = p + 2; // 指向数组的第三个元素 Console.WriteLine(*q); // 输出3 } } ``` ### 4. 注意事项 - **安全性**:使用指针可能会导致程序崩溃或数据损坏,因此在使用时必须非常小心。 - **性能**:虽然指针可以提高性能,但在大多数情况下,使用安全且易于维护的代码更为重要。 - **兼容性**:指针只能在不安全的上下文中使用,并且需要在项目属性中启用“允许不安全代码”。 ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值