codecamp

C# 不安全代码指针

C# 不安全代码指针

C#可以通过标记为不安全的代码块中的指针进行直接内存操作。

不安全代码应使用 /unsafe 编译器选项进行编译。

指针基础

指针实例保存变量的地址。

指针类型可以转换为任何其他指针类型。

主要的指针运算符是:

运算符含义
&返回一个指向变量地址的指针
*返回指针地址处的变量
->一个语法快捷方式,其中x-> y等价于(* x).y

不安全代码

通过用unsafe关键字标记类型,类型成员或语句块,我们可以使用指针类型并对内存执行C ++风格指针操作。

下面是使用指针快速处理数组的示例:


unsafe void Process (int[,] data){
   int length = data.Length;
   fixed (int* b = data){
      int* p = b;
      for (int i = 0; i < length; i++)
          *p++ &= 0xFF;
    }
}

固定语句

在一个固定语句中,我们可以获得任何值类型的指针,值类型的数组或字符串。

在数组和字符串的情况下,指针将实际指向第一个元素,它是一个值类型。

在引用类型中声明为内联的值类型需要将引用类型固定,如下所示:


class Main {
   int x;
   static void Main(){
      Test test = new Test();
      unsafe{
         fixed (int* p = &test.x) // Pins test
         {
            *p = 0;
         }
         System.Console.WriteLine (test.x);
      }
   }
}

指针到成员运算符

除了& * 运算符之外,C#还提供了C ++风格的 -> 运算符,它可以在结构上使用:


struct Test{
   int x;
   unsafe static void Main(){
      Test test = new Test();
      Test* p = &test;
      p->x = 1;
      System.Console.WriteLine (test.x);
   }
}
C# 属性
C# 预处理器指令
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }