【C#/笔记】C#中的不安全代码(指针)

不安全代码

  • 介绍
    C#中可以像C++一样使用指针进行内存操作,包含指针操作的代码为不安全代码。
    由于直接操作内存,效率一般更高。

  • 可指定类型

    1. 任何整形类型
    2. 任何浮点型类型
    3. 字符
    4. 布尔型
    5. 小数
    6. 任何枚举类型
    7. 任何指针类型
    8. 任何仅包含非托管类型字段的用户定义的结构类型
  • 注意
    指针类型不从对象继承,并且指针类型与 object 之间不存在转换。 此外,装箱和取消装箱不支持指针。 但是,你可在不同的指针类型之间以及指针类型和整型之间进行转换。

    指针不能指向引用或包含引用的结构,因为无法对对象引用进行垃圾回收,即使有指针指向它也是如此。 垃圾回收器并不跟踪是否有任何类型的指针指向对象。

  • 一般声明方式

    1. int* p :p 是指向整数的指针。
    2. int** p :p 是指向整数的指针的指针。
    3. int*[] p :p 是指向整数的指针的一维数组。
    4. char* p :p 是指向字符的指针。
    5. void* p : p 是指向未知类型的指针。
  • 设置编译器

    • VS
      参考

    • 命令行编译:
      csc -unsafe prog1.cs 、csc /unsafe prog1.cs

    • Unity中:
      File->Build Settings->Player Settings->Other Settings->Allow “unsafe” Code

  • unsafe关键字

    1. 在成员名前面修饰
      unsafe int* val
      unsafe void Dosomething(){ … }
    2. 直接使用代码块
      unsafe { … }
  • fixed关键字
    由于C#中声明的变量在内存中的存储受垃圾回收器管理;因此一个变量(例如一个大数组)有可能在运行过程中被移动到内存中的其他位置。

    使用fixed关键字来固定变量位置不移动。
    fixed(int *ptr = int[5]) {//…}

  • stackalloc
    在unsafe不安全环境中,我们可以通过stackalloc在堆栈上分配内存,由于在堆栈上分配的内存不受内存管理器管理,因此其相应的指针不需要固定。
    int *ptr = stackalloc int[1] ;

  • 符号
    可对指针执行的运算符

运算符作用
*执行指针间接寻址
->通过指针访问结构的成员
[]为指针建立索引
&获取变量的地址
++ 和 –递增和递减指针
  • 和 -
执行指针算法
==、!=、<、>、<= 和 >=比较指针
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值