C#中指针的使用

在C#中,有时候希望通过指针来操作内存,这样可以提高效率。我们可以用unsafe关键字修饰含有指针操作的程序段,如下所示:

class Program
{
  static int Main(string[] args)
  {

      unsafe
      {
          // ...
      }
  }
}

unsafe只是编译器指令语法,只是在编译的时候起作用,并不是说unsafe修饰的程序段是unmanaged,他们仍然是managed的。

 

在C#里定义指针和C++有些不同:

1. C#指针定义的星号只能和类型在一起

     int* p1, p2;    //p1和p2都是int*指针

     而在C++中与之等价的定义是:

     int *p1, *p2;  //C++

     int *p1, p2;   //C++中,p2只是一个普通的int

 

2. C#指针类型不能是引用类型,不能是含有引用类型的自定义类型或复合类型,只能是预定义类型

    string* pMessage    //错误C#指针定义

    struct ServiceStatus
    {
      int State;
      string Description;  // 引用类型   

    }

    ServiceStatus* pStatus   //错误指针定义

 

3. C#中指针赋值

    在C#里,引用类型也叫Movable类型,由于垃圾回收器和内存布局优化,在堆上分配的内存是不固定的,会被挪动。所不   

    能将堆上分配的地址赋值给C#指针, 如果能将堆上地址固定,就没有问题了,那么如何固定引用类型?C#中有一个关键字 

    fixed可以用在此处。

    byte* pData = &bytes[0];  // 编译错误,数组在C#里是引用类型,属于movable

    byte[] bytes = new byte[24];
    fixed (byte* pData = &bytes)   //正确,使用fixed固定
    {
       // ...
    }

    当然,使用fixed不是没有代价的,它会使内存出现碎片。

转载于:https://www.cnblogs.com/caibq/archive/2011/09/11/Cai_Yao.html

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值