Я хочу показать, как языки обрабатывают косвенный доступ к данным. Чтобы понять косвенный доступ, давайте посмотрим, как будет выглядеть прямой доступ.
Обычно я показываю сравнение, написав на других языках, но редакторы на этих языках плохо работали на моем телефоне. Я также не знаю, как добавить это в серию с новым 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”