C++/CLI指针入门

总结:

*是指针,指向一个地址,使用*对指针变量进行解引用(访问地址)得到具体的值(对象)。对指针指向的变量进行赋值需要解引用。使用->访问成员。

&是引用,是一个对象的别名,不需要解引用这样的操作。

^是跟踪句柄,类似于指针,解引用也使用*,访问成员也使用->。

%是跟踪引用,非常类似于&的作用,只不过是用于托管类。

赋值:

追踪句柄对待引用类型的方式是和传统指针的用法类似,但值类型有所区别。

int i = 2;

int^ h = i; //不指向i,分配新空间,所以当修改h时,i不会改变。这等同于C#值类型的处理方式。没有办法指向i,除非用指针(C#中可以unsafe使用指针)

int* p = &i; //指向i,没有分配新空间,修改*p时i改变

Exception e("Error");

Exception^ eh = %e; //指向e,没有分配新空间

 

 

using namespace std;
using namespace System;

void Demo()
{
	int i = 1;
	int* iPtr = &i; //指向i的指针
	int& iRef = i; //i的引用
	int^ iHdle = i; //跟踪句柄,此时的iHdle在栈上复制了i的值,并不指向i
	int% iMref = i; //i的跟踪(托管)引用,用于托管类的引用
	cout << *iPtr - *iHdle << endl; //跟踪句柄和指针的解引用都使用*
	iHdle->ToString(); //跟踪句柄也使用->访问成员
	(*iHdle).ToString(); //跟踪句柄解引用
	int*& iPtrRef = iPtr; //指针的引用
	*iPtrRef = 2; //解(指针)引用后修改了i
	cout << i - *iHdle << endl; //i为2,iHdle指向的值为1(iHdle不指向i)
	cout << i << endl;

	int*% iPtrMref = iPtr; //指针的托管引用
	*iPtrMref = 3; //解(指针)引用后指向i
	cout << i << endl; //i为3

	int^* iHdlePtr = &iHdle; //跟踪句柄的指针
	*iHdlePtr = 4; //解引用后为iHdle句柄,iHdle指向的值由1修改为4
	cout << (*(*iHdlePtr)) << endl; //解指针引用->解句柄引用,得到int值4

	int^& iHdleRef = iHdle; //跟踪句柄的引用
	iHdleRef = 5; //iHdle指向的值由4修改为5
	cout << *iHdle << endl;

	int^% iHdleMref = iHdle; //跟踪句柄的跟踪引用
	iHdleMref = 6; //iHdle指向的值由5修改为6
	cout << *iHdle << endl;
	
	int** iPtrPtr = &iPtr; //指针的指针
	**iPtrPtr = 7; //解引用,解引用,i的值由3修改为7
	cout << i << endl;

	int&& iRRef = *iPtr + 0; //凑数的右值引用
	iRRef = 8;
	cout << iRRef << endl;
	
	int^*& iHdlePtrRef = iHdlePtr; //跟踪句柄的指针的引用
	*iHdlePtrRef = 9; //解(指针)引用,iHdle指向的值由6修改为9
	cout << *iHdle << endl;
	
	int^*% iHdlePtrMref = iHdlePtr; //跟踪句柄的指针的跟踪引用
	*iHdlePtrMref = 10; //解(指针)引用,iHdle指向的值由9修改为10
	cout << *iHdle << endl;
	
	int^** iHdlePPtr = &iHdlePtr; //跟踪句柄的指针的指针
	**iHdlePPtr = 11; //解指针引用,解指针引用,iHdle指向的值由10修改为11
	cout << *iHdle << endl;

	int^*&& iHdlePtrRRef = static_cast<int^*&&>(iHdlePtr); //跟踪句柄的指针的右值引用
	*iHdlePtrRRef = 12;
	cout << *iHdle << endl; //12

	int^**&& iHdlePPtrRRef = static_cast<int^**&&>(iHdlePPtr); //跟踪句柄的指针的指针的右值引用
	**iHdlePPtrRRef = 13;
	cout << *iHdle << endl; //13

	getchar();
}

 

添加评论

Loading