Как получить значение указателя в C ++ / CLI? - PullRequest
0 голосов
/ 29 сентября 2018

Собственный cpp-файл C ++:

#include "stdafx.h"
#include <iostream>
int strcpyTest(int dest, int *sour)
{
    int s = dest + 10;
    std::cout << "s" << s << std::endl;
    std::cout << "&s" << &s << std::endl;
    sour = &s;
    int x = *sour + 20;
    std::cout << "sour" << sour << std::endl;
    std::cout << "*sour" << *sour << std::endl;
    return x;
}

C ++ / CLI-файл h:

#pragma once
using namespace System;
using namespace System::Runtime::InteropServices;
namespace SubFunction {
    public ref class Test
    {
    public:
        int StrTest(int d);
        int xxx;
    };
}

Cpp-файл C ++ / CLI:

#include "stdafx.h"
#include "CPlusPlus.h"
#include "SubFunction.h"
int SubFunction::Test::StrTest(int d)
{
    int x;
    int dd = strcpyTest(d, &x);
    xxx = x;
    return dd;
}

C # cs-файл:

int a = 15;
Test ts = new Test();
int x = ts.StrTest(a);
int y = ts.xxx;
MessageBox.Show(x.ToString());
MessageBox.Show(y.ToString());

В последнем MessageBox "xxx" является адресом указателя.Впервые «xxx» имеет значение адреса указателя.Если он рассчитывается снова, он всегда появляется 0. Почему?Я не понимаюКак получить значение?Или получить значение «кислый»?

1 Ответ

0 голосов
/ 30 сентября 2018

Попробуйте установить *sour = s;, тогда вы увидите, что значение 'x' изменилось внутри 'StrTest ()', и вы получите то поведение, которое ожидаете, что 'x' будет иметь значение 's'.

Когда вы устанавливаете sour = &s;, как в приведенном здесь примере, вы меняете адрес, на который указывает локальный указатель 'sour', и StrTest () не узнает об этом,поскольку это локальная копия указателя, который вы передали.

Используя '* sour = s', вы изменяете значение переменной, на которую он указывает, на 'x'.

Вы можете думать об этом так, как локальный указатель 'sour' является локальной копией и создается и доступен только для 'strcpyTest ()' и уничтожается, когда он выходит за рамки видимости, однако он содержит ссылку на 'x', котораяВы передали так, что если вы разыменуете локальный указатель 'кислый', вы можете изменить значение x.

Иллюстрация:

Внутри

int strcpyTest(int dest, int *sour)

Примечание: Это неверный синтаксис, это просто для иллюстрации.

sour ----> [& x] // Содержит адрес переменной 'x', переданный функцией 'StrTest ()'* sour ----> [x] // Извлекает значение переменной 'x' (Разыменовывает 'sour', чтобы получить доступ к значению 'x')

sour = (Address) // Sets a new address to 'sour', which means it no longer points to '&x' that you passed in from 'StrTest()'
*sour = (Value) // Still points to '&x' from 'StrTest()', and assigns a new value to it

Если вы передаете '& x'или вы создадите указатель и передадите его в функцию 'strcpyTest ()', тогда вы обнаружите, что sour будет локальной копией этого указателя.

Примечание: если у вас есть структура данныхэто не мало, тогда я предлагаю вам вернуть указатель на него из strcpyTest () вместо того, чтобы возвращать фактическое значение, чтобы избежать ненужного копирования данных, кроме того, что совершенно нормально установить *sour = s;.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...