在C#中使用指针

在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

 

未完待续......

posted @ 2006-10-03 10:49  洪虎  阅读(1916)  评论(0编辑  收藏  举报