Рубрики
Без рубрики

Косвенный доступ (Указатели)

Я хочу показать, как языки обрабатывают косвенный доступ к данным. Чтобы понять непрямой доступ, давайте посмотрим… С тегами lang, csharp, java.

Я хочу показать, как языки обрабатывают косвенный доступ к данным. Чтобы понять косвенный доступ, давайте посмотрим, как будет выглядеть прямой доступ.

Обычно я показываю сравнение, написав на других языках, но редакторы на этих языках плохо работали на моем телефоне. Я также не знаю, как добавить это в серию с новым dev.to интерфейс.

// dlang 
void main() @safe {
    int i = 7;
    int j = i;

    j = 2;
    assert(i == 7);

    void addOne(int num) @safe pure nothrow {
        num = num + 1;
    }

    addOne(i);
    assert(i == 7);
}

Здесь мы видим, что каждая переменная работает независимо от других значений, моя функция addOne не имеет никакого фактического эффекта вне функции. Часто это называют передачей по значению.

Давайте сравним это с косвенным доступом.

// dlang 
// we see this option in C++ and C#
void main() @safe {
    int j = 7;

    // take the argument by reference
    void addOne(ref int num) @safe pure nothrow {
        num = num + 1;
    }

    addOne(j);

    assert(j == 8);
}

Здесь мы обнаруживаем, что значение передано в функцию и изменено. Давайте быстро взглянем на другой способ сделать то же самое.

// dlang 
// we see this in C and available in C++
void main() {
    int j = 7;

    // accept a pointer to an int
    void addOne(int* num) @safe pure nothrow {
        *num = *num + 1;
    }

    // take the address of where j is stored 
    addOne(&j);

    assert(j == 8);
}

Однако есть и другие способы сделать это, и это называется передачей по ссылке, и это происходит с классом.

// dlang 
// we see this option in C# and Java

public class Num {
    int value;
    @safe:
    pure nothrow
    this(int v) { value = v; } 
} 


void main() @safe {
    Num j = new Num(7);

    // take the argument by reference
    void addOne(Num num) @safe pure nothrow {
        num.value = num.value + 1;
    }

    addOne(j);

    assert(j.value == 8);
}

Оригинал: “https://dev.to/jessekphillips/indirect-access-pointers-57bd”