Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ cli 如果我使用"&&引用;要获取C+;中值类型的地址+\CLI?_C++ Cli - Fatal编程技术网

C++ cli 如果我使用"&&引用;要获取C+;中值类型的地址+\CLI?

C++ cli 如果我使用"&&引用;要获取C+;中值类型的地址+\CLI?,c++-cli,C++ Cli,假设我编写以下代码: public ref class Data { public: Data() { } Int32 Age; Int32 year; }; public void Test() { int age = 30; Int32 year = 2010; int* pAge = &age; int* pYear = &year; Data^ data = gcnew D

假设我编写以下代码:

public ref class Data
{
public:
    Data()
    {
    }

    Int32 Age;
    Int32 year;
};

public void Test()
{
    int age = 30;  
    Int32 year = 2010;  
    int* pAge = &age;  
    int* pYear = &year;


    Data^ data = gcnew Data();
    int* pDataYear = &data->Year; // pData is interior pointer and the compiler will throw error
}
如果编译程序,编译器将抛出错误:
错误C2440:“初始化”:无法从“cli::interior\u ptr”转换为“int*”
因此,我了解到“&data->Year”是一种内部指针。
更新:我试图使用“&(数据->年份)”,同样的错误

但是佩奇和皮耶尔呢?
它们是本机指针、内部指针还是固定指针

如果我想在以下本机函数中使用它们:

void ChangeNumber(int* pNum);
传递pAge或pYear是否安全?

它们(
pAge
pYear
)是本机指针,将它们传递给本机函数是安全的。堆栈变量(具有自动存储生存期的局部变量)不会被垃圾收集器重新排列,因此不需要固定

将托管数据复制到堆栈,然后将其传递给本机函数,在许多情况下解决了gc移动托管数据的问题(当然,不要将其与回调结合使用,因为回调期望在包装器有机会复制回值之前更新原始变量)

要获取托管数据的本机指针,必须使用固定指针。这可能比将值复制到堆栈的方法慢,因此,如果值较大,或者确实需要函数直接对同一变量进行操作(例如,该变量用于回调或多线程),请使用该方法

比如:

pin_ptr<int> p = &mgd_obj.field;
pin_ptr p=&mgd_obj.field;
另见