2016-04-13 3 views
1

Поскольку неуправляемый C++ не может найти другой объект. Такие, как указатель на массивРазличия указателей между неуправляемым C++ и управляемым C++

int pt[50]; 
int* pointer = pt; 

Мы можем напрямую использовать * указатель, чтобы получить первое значение элемента в массиве. Таким образом, мы можем также использовать * (указатель ++), чтобы указать на второй элемент.

Однако, если можно напрямую использовать^(указатель + 5), чтобы получить шестой элемент массива? Пример следующий.

array<int>^ pt = gcnew array<int>(50); 
int^ pointer = pt; 

Как я могу использовать указатель в качестве носителя для доступа к другому элементу массива?

ответ

0

здесь несколько иной подход, который может быть полезен ...

Он использует внутреннюю арифметику указателей (для обхода массива).

Надеюсь, это поможет.

using namespace System; 

ref class Buf 
{ 
    // ... 
}; 

int main() 
{ 
    array<Buf^>^ array_of_buf = gcnew array<Buf^>(10); 

    // Create a Buf object for each array position 
    for each (Buf^ bref in array_of_buf) 
    { 
     bref = gcnew Buf(); 
    } 

    // create an interior pointer to elements of the array 
    interior_ptr<Buf^> ptr_buf; 

    // loop over the array with the interior pointer 
    // using pointer arithmetic on the interior pointer 
    for (ptr_buf = &array_of_buf[0]; ptr_buf <= &array_of_buf[9]; ptr_buf++) 
    { 
     // dereference the interior pointer with * 
     Buf^ buf = *ptr_buf; 
     // use the Buf class 
    } 
} 

ссылка: C++/CLI Visual C++ язык для .net (стр 99)

вот другой пример из: https://msdn.microsoft.com/en-us/library/y0fh545k.aspx

// interior_ptr.cpp 
// compile with: /clr 
using namespace System; 

ref class MyClass { 
public: 
    int data; 
}; 

int main() { 
    MyClass^h_MyClass = gcnew MyClass; 
    h_MyClass->data = 1; 
    Console::WriteLine(h_MyClass->data); 

    interior_ptr<int> p = &(h_MyClass->data); 
    *p = 2; 
    Console::WriteLine(h_MyClass->data); 

    // alternatively 
    interior_ptr<MyClass ^> p2 = &h_MyClass; 
    (*p2)->data = 3; 
    Console::WriteLine((*p2)->data); 
} 
Смежные вопросы