在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不是没有代价的,它会使内存出现碎片。

 CLR支持3种指针类型:受托管指针,非托管指针和非托管函数指针。受托管指针存储在堆上的托管快的引用,非托管指针也就是指传统意义上的指针。

 受托管指针存储在堆上的托管快的引用,非托管指针也就是指传统意义上的指针
受托惯的是伪地址 
非托管的是真实的

C#中指针的使用(转)的更多相关文章

  1. Objective-C 和 C++中指针的格式和.方法 和内存分配

    最近在看cocos2d-x,于是打算复习一下C++,在这里简单对比下,留个念想. 先看看oc中指针的用法 @interface ViewController : UIViewController { ...

  2. 上机实践 - - 一个例子了解C/C++中指针与数组的区别

    本例子来自于<剑指Offer>(P37) 解答如下: size1:20 data1是一个数组,sizeof(data1)是求数组大小. 这个数组包含5个整数,每个整数4个字节,共20字节. ...

  3. (原)C++中指针不初始化就传递的问题

    C++中指针的使用.以前在使用指针之前都会初始化.今天没有初始化,然后指针传递后没有内容(testptrnoret),后来发现返回指针的话(testptrret),就可以了. // testptr.c ...

  4. Keil C51 中指针的使用

    指针是C语言中比较难的一个内容,Keil C51在指针方面有和标准C不一样的地方,今天看了一些资料学习了一下Keil C51 中指针的使用. keil51的指针,包含两种指针:普通指针,兼容标准C:内 ...

  5. C语言中指针*p[N], (*P)[N],及**p的区别

    在C语言编程中指针经常困扰着我们,但是若能灵活运用指针的话,将会使得我们编程变得更加轻松与高效.这里讲下*p[N], (*P)[N],及**p的区别,这也是之前经常困扰我的地方. 这三者的定义分别为: ...

  6. C中指针符*和取址符&

    学习了C语言之后,关于指针部分看了无数遍,有时候明明觉得自己看懂了,指针就是地址,但是总是在看代码时候糊里糊涂的搞不明白,最近又关于指针强化了一把. 大部分情况下对于程序中指针糊涂是因为不明白指针符“ ...

  7. C语言中指针占据内存空间问题

    以前一直有个疑问,指向不同类型的指针到底占用的内存空间是多大呢? 这个问题我多次问过老师,老师的答案是"指向不同类型的指针占据的内存空间大小不同",我一直很之一这个答案,今天我就做 ...

  8. 转 浅谈C++中指针和引用的区别

    浅谈C++中指针和引用的区别 浅谈C++中指针和引用的区别   指针和引用在C++中很常用,但是对于它们之间的区别很多初学者都不是太熟悉,下面来谈谈他们2者之间的区别和用法. 1.指针和引用的定义和性 ...

  9. 理解C语言中指针的声明以及复杂声明的语法

    昨天刚把<C程序设计语言>中"指针与数组"章节读完,最终把心中的疑惑彻底解开了.如今记录下我对指针声明的理解.顺便说下怎样在C语言中创建复杂声明以及读懂复杂声明. 本文 ...

  10. 这样子来理解C语言中指针的指针

    友情提示:阅读本文前,请先参考我的之前的文章<从四个属性的角度来理解C语言的指针也许会更好理解>,若已阅读,请继续往下看. 我从4个属性的角度来总结了C语言中的指针概念.对于C语言的一个指 ...

随机推荐

  1. Dapr + .NET Core实战(十三)跨语言开发

    因为基于Dapr的服务架构是不限语言的,我们来看看Dapr的跨语言开发.我们使用golang,python,.NET来实现跨语言的服务调用,拓扑如下 我们继续使用.NET 5的fontend和back ...

  2. enum 试图表达64位数

    enum AttributeType: unsigned long long{ aa = 1, bb = 2, cc = 0x842AC1040000}; int main() { DWORD64 b ...

  3. 通过Swagger文档生成前端service文件,提升前端开发效率

    在企业级的项目开发过程中,一般会采用前后端分离的开发方式,前后端通过api接口进行通信,所以接口文档就显得十分的重要. 目前大多数的公司都会引入Swagger来自动生成文档,大大提高了前后端分离开发的 ...

  4. 基于linux在线预览

    1.Libreoffice安装 在服务器上安装Libreoffice,在这里就不多说了, import os import sys import subprocess import re def co ...

  5. appium操作安卓应用所需要的数据准备

    操作系统.系统版本如下所示: desired_caps={} desired_caps["platformName"]="Android" desired_ca ...

  6. Linux tomcat 部署war包

    将打包好的 war包放在 webapps的文件夹下 在tomcat/conf 文件夹下的 server.xml 里填加 <Context path="" docBase=&q ...

  7. mysql锁场景及排查

    1.查询长时间不返回: 在表 t 执行下面的 SQL 语句: mysql> select * from t where id=1; 查询结果长时间不返回. 一般碰到这种情况的话,大概率是表 t ...

  8. python收集参数与解包

    收集任意数量的实参 def make_pizza(*toppings): """打印顾客点的所有配料""" print(toppings) ...

  9. 5个步骤,教你瞬间明白线程和线程安全.md

    记得刚来杭州面试的时候,有一家公司的技术总监问了我这样一个问题:你来说说有哪些线程安全的类?我心里一想,这我早都背好了,稀里哗啦说了一大堆. 他又接着问:那你再来说说什么是线程安全?--然后我就GG了 ...

  10. 【数据结构 C++】排序——冒泡、插入、选择、希尔、归并、快排、堆排序

    LeetCode 912. 排序数组 给你一个整数数组 nums,请你将该数组升序排列. 示例 1: 输入:nums = [5,2,3,1] 输出:[1,2,3,5] 示例 2: 输入:nums = ...