简述
为了保持类型安全性,默认情况下,C#不支持指针算法。C#的托管内存管理提供一套安全管理对象的平台,更高级的语言就意味着更全面的封装。指针不是安全类型,用完后你需要自己释放分配的内存,如果不注意很容易内存泄漏的。
当然,如果你是高级程序员,有需要通过操作指针来操作内存,这样可以提高程序效率,不怕麻烦可以使用,我们可以用C#中的unsafe关键字修饰含有指针操作的程序段。.
class Program
{
static int Main(string[] args)
{
unsafe
{
// ...
}
}
}
unsafe只是编译器指令语法,只是在编译的时候起作用,并不是说unsafe修饰的程序段是unmanaged,他们仍然是managed的。
考点
主要考察C#语言设计的初衷,c#托管内存管理就是跟你提供一套安全管理对象的平台,不用考虑内存释放的问题,提高程序员的学习成本和工作效率。
使用方式
在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不是没有代价的,它会使内存出现碎片。