如何:用 interior_ptr 关键字声明值类型 (C++/CLI)

interior_ptr 可以用于值类型。

重要

/clr 编译器选项支持此语言功能,但是 /ZW 编译器选项不支持此语言功能。

示例:具有值类型的 interior_ptr

说明

下面的 C++/CLI 示例展示了如何将 interior_ptr 用于值类型。

代码

// interior_ptr_value_types.cpp
// compile with: /clr
value struct V {
   V(int i) : data(i){}
   int data;
};

int main() {
   V v(1);
   System::Console::WriteLine(v.data);

   // pointing to a value type
   interior_ptr<V> pv = &v;
   pv->data = 2;

   System::Console::WriteLine(v.data);
   System::Console::WriteLine(pv->data);

   // pointing into a value type
   interior_ptr<int> pi = &v.data;
   *pi = 3;
   System::Console::WriteLine(*pi);
   System::Console::WriteLine(v.data);
   System::Console::WriteLine(pv->data);
}
1
2
2
3
3
3

示例:this 指针

说明

在值类型中,this 指针的计算结果为 interior_ptr。

在值类型 V 的非静态成员函数体中,thisinterior_ptr<V> 类型的表达式,其值是函数调用的对象地址。

代码

// interior_ptr_value_types_this.cpp
// compile with: /clr /LD
value struct V {
   int data;
   void f() {
      interior_ptr<V> pv1 = this;
      // V* pv2 = this;   error
   }
};

示例:address-of 运算符

说明

下面的示例演示了如何将 address-of 运算符与静态成员一起使用。

静态 Visual C++ 类型成员的地址产生本机指针。 静态值类型成员的地址是托管指针,因为值类型成员在运行时堆上分配,并且可由垃圾回收器移动。

代码

// interior_ptr_value_static.cpp
// compile with: /clr
using namespace System;
value struct V { int i; };

ref struct G {
   static V v = {22};
   static int i = 23;
   static String^ pS = "hello";
};

int main() {
   interior_ptr<int> p1 = &G::v.i;
   Console::WriteLine(*p1);

   interior_ptr<int> p2 = &G::i;
   Console::WriteLine(*p2);

   interior_ptr<String^> p3 = &G::pS;
   Console::WriteLine(*p3);
}
22
23
hello

另请参阅

interior_ptr (C++/CLI)