在C#中使用指针
C#语言是一种.Net语言,它的代码经过编译后产生的各种对象大多都是受.Net框架管理的托管代码。与C++不同的是它的内存管理是由.Net框架提供,而不像C++要自己管理。.Net框架使用垃圾收集器和引用来管理内存的使用。当一个对象不再被任何对象引用时,就可能被垃圾收集器清理掉,同时释放占用的内存。接着.Net框架会压缩托管堆以便在下次分配内存时有连续的内存块可供分配。这样一种处理方式是有效和安全的。
但某些时候为了一些特殊的目的,我们也许还是需要直接对内存访问。例如:性能方面的问题,或要访问非托管代码编写的DLL,需要把一个指针当作参数来传递。这些时候就需要使用到指针,就像C++中的指针一样。
实际上C#中的引用就是一个指针,它的内容就是它所引用对象的地址。只不过在没有特殊声明的情况下,C#的引用属于.Net托管的安全的指针。而且C#的引用语法不允许直接访问引用所包含的变量地址,这样就失去了C++中直接对指针操作的灵活性和技巧。C#的引用主要提供了易用和安全的方式访问内存,能够防止用户无意中执行某些破坏内存内容的操作。但如果确实需要使用指针直接访问内存,那么这段代码将被视作不安全代码,需要特别标注。标注不安全代码的语法如下:
unsafe int functionName() {...} // 把函数标记为不安全代码
unsafe class className {...} // 把类标记为不安全代码
class className{ unsafe int * pX; } // 把类的成员标记为不安全代码
但是不能把局部变量标记为不安全代码,例如:
int functionName() { unsafe int * pX; } // 这是错误的声明
如果要使用不安全的局部变量,就需要在方法或不安全的语句块中声明和使用它。在使用指针前,还需要告诉编译器有不安全代码块。可以使用如下命令来编译含有不安全代码的源文件:
csc /unsafe MyCode.cs
使用指针
要使用指针,首先是声明指针变量,语法如下:
int * pA,pB;
int*[] pList;
这里注意与C++的不同之处,int * pA,pB 这段代码在C++中声明了一个整形指针和一个整形变量,如果要同时声明两个整形指针应该是这样写 int *pA, *pB ,但C#中“*”是与类型相关,而不是与变量相关,所以 int * pA,pB 就同时声明了两个指针变量。
另外同C++一样“&”表示获取变量的地址,“*”表示获取指针所指变量的内容。如下:
int x = 10; // 声明一个变量
int * pX,pY; // 声明两个指针
pX = &x; // 取出变量x的地址放到指针pX中
pY = pX; // 将一个指针的内容复制给另一个指针
*pY = 20; // 将变量x的内容改为20
未完待续......