在本文中,我将解释为什么使用本地指针来管理对象。原因在于对象是以垃圾收集器移动的。所以,当对象移动时,本地指针就变成无效的。所以,如果你想取得一个托管对象的本地指针,你就会遇到一个编译错。下面的代码显示了这上点。
using namespace System. 
int _tmain() 
{ 
 int ^ hnd = gcnew int(100).
 int* np = &.hnd. // Genarates a compile error 
}  
  但是本地指针还是非常有用的,如在使用指针算术和指针比较时就有许多的优点。所以新的C   CLI允许你使用一个内部指针实现同样的功能。内部指针是本地指针的一个超集。所以它能够做任何内部指针所能做的一切。 但是当垃圾收集器移动指针所指向的对象时,内部指针也帮助程序实现其指向的地址的更新。
  现在让我们看一下如何用内部指针来实现指针算术运算。
#include "stdafx.h" 
#include 
using namespace System. 
using namespace stdcli::language. 
int _tmain() 
{ 
 const int SIZE = 10. 
 array^ arr = gcnew array(SIZE). 
 for(int idx = 0. idx < SIZE. idx  ) 
 { 
  arr[idx] = idx   1. 
 } 
 // 取得指向数组第一个元素的指针
 interior_ptr p = &.arr[0]. 
 // 通过增加指针值读取并输出数组元素
 for(int idx = 0. idx < 10. idx  ) 
 { 
  printf("Value of the element at %Xh ", p). 
  Console::WriteLine(" is {0}",*(p  )). 
 } 
 Console::ReadLine(). 
}  
  不管垃圾收集器执行多少次和数组元素移动多少次,上面的代码仍然能工作良好。于是C  的力量又回到了.Net运行时刻库上。但是要小心使用内部指针。这些指针与本地指针非常相似,当试图存取不允许操作的内存区段时能给程序造成危害。例如,如果我在上面的代码中试图存取下一个p  ,它将返回恰好在上面数组元素上方4字节的内存段位置。 
 
								 
									
相关文章
									
C  :最强大的.NET语言之对象构造
C  数据类型的属性与限制
VisualC  2005中开发自定义绘图控件
C  的未来之路:C  0x概览
C  _CLI思辨录之代理构造函数
C  多态技术的实现和反思
保持C_C  程序代码可伸缩性
澳大利亚华人论坛
考好网
日本华人论坛
华人移民留学论坛
英国华人论坛