Разница между вызовом по значению и вызовом по ссылке

Ключевая разница между вызовом по значению и вызовом по ссылке

  • В методе «Вызов по значению» исходное значение не изменяется, тогда как в методе «Вызов по ссылке» изменяется исходное значение.
  • При вызове по значению передается копия переменной, тогда как при вызове по ссылке передается сама переменная.
  • При вызове по значению фактические и формальные аргументы будут создаваться в разных ячейках памяти, тогда как при вызове по ссылке фактические и формальные аргументы будут создаваться в одном и том же месте памяти.
  • Вызов по значению — это метод по умолчанию в таких языках программирования, как C++, PHP, Visual Basic NET и C#, тогда как вызов по ссылке поддерживается только в Java язык.
  • Переменные вызова по значению передаются простым методом, тогда как указатели вызова по ссылке необходимы для хранения адреса переменных.

Разница между вызовом по значению и вызовом по ссылке

В языках программирования функции можно вызывать двумя способами: вызовом по значению и вызовом по ссылке.

Что такое метод вызова по значению?

Метод вызова по значению копирует значение аргумента в формальный параметр этой функции. Следовательно, изменения, внесенные в параметр основной функции, не влияют на аргумент.

В этом методе передачи параметров значения фактических параметров копируются в формальные параметры функции, а параметры сохраняются в разных ячейках памяти. Таким образом, любые изменения, сделанные внутри функций, не отражаются на фактических параметрах вызывающего объекта.

Что такое метод вызова по ссылке?

Метод вызова по ссылке копирует адрес аргумента в формальный параметр. В этом методе адрес используется для доступа к фактическому аргументу, используемому при вызове функции. Это означает, что изменения, внесенные в параметр, изменяют передаваемый аргумент.

В этом методе выделение памяти такое же, как и фактические параметры. Все операции в функции выполняются над значением, хранящимся по адресу фактического параметра, и измененное значение будет сохранено по тому же адресу.

Пример кода C для метода вызова по значению

void main() {
        int a = 10,
        void increment(int);
        Cout << "before function calling" << a;
        increment(a);
        Cout << "after function calling" << a;
        getch();

        void increment(int x) {
            int x = x + 1;
            Cout << "value is" << x;
        }

Вывод:

before function calling 10
value is 11
after function calling 1-0

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

Java Пример кода метода вызова по ссылке

Public static void main(string args[]) {
    int a = 10;
    System.out.println("Before call Value of a = ", a);
    Void increment();
    System.out.println("After call Value of a = ", a);
}

Void increment(int x) {
    int x = x + 1;
}

Вывод:

Before call Value of a =10
After call Value of a =11

Потому что переменная, объявленная «a» в, ссылается/указывает на переменную «a» в main(). Здесь имя переменной другое, но оба указывают/ссылаются на одни и те же адреса памяти.

Вызов по значению и вызов по ссылке

параметры Звонок по значению Звоните по ссылке
Определение Когда при вызове функции вы передаете значения путем копирования переменных, это называется «Вызов по значениям». При вызове функции на языке программирования вместо копирования значений переменных используется адрес переменных, это известно как «вызов по ссылкам».
аргументы В этом методе передается копия переменной. В этом методе передается сама переменная.
эффект Изменения, сделанные в копии переменной, никогда не изменяют значение переменной вне функции. Изменение переменной также влияет на значение переменной вне функции.
Изменение стоимости Не позволяет вносить какие-либо изменения в фактические переменные. Позволяет вносить изменения в значения переменных с помощью вызовов функций.
Передача переменной Значения переменных передаются простым методом. Переменные-указатели необходимы для хранения адресов переменных.
Изменение значения Исходное значение не изменено. Исходное значение изменяется.
Место в памяти Фактические и формальные аргументы
будут созданы в разных
место в памяти
Фактические и формальные аргументы
будет создан там же
место в памяти
Безопасность Фактические аргументы остаются
безопасны, поскольку их нельзя изменить
случайно.
Реальные аргументы не
Безопасный. Они могут быть
случайно изменен, поэтому вам необходимо осторожно обращаться с операциями с аргументами.
По умолчанию По умолчанию во многих программах
такие языки, как C++.PHP. Visual Basic NET и C#.
Его поддерживают большинство
языки программирования, такие как JAVA, но
не по умолчанию.

Преимущества использования метода «Вызов по значению» в C

Плюсы/преимущества вызова по значению в C:

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

Преимущества использования метода «Вызов по ссылке»

Плюсы использования метода вызова по ссылке:

  • Функция может изменять значение аргумента, что весьма полезно.
  • Он не создает повторяющиеся данные для хранения только одного значения, что помогает вам сэкономить место в памяти.
  • В этом методе копия аргумента не создается. Поэтому он обрабатывается очень быстро.
  • Помогает избежать изменений, сделанных по ошибке.
  • Человек, читающий код, никогда не узнает, что значение можно изменить в функции.

Недостатки использования метода «Вызов по значению»

Вот основные минусы/недостатки вызова по методу значения:

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

Недостатки использования метода «Вызов по ссылке»

Вот основные недостатки использования метода вызова по ссылке:

  • Сильная ненулевая гарантия. Функция, принимающая ссылку, должна убедиться, что входные данные не равны нулю. Поэтому проверку нуля выполнять не требуется.
  • Передача по ссылке делает функцию теоретически нечистой.
  • Пожизненная гарантия — большая проблема с рекомендациями. Это особенно опасно при работе с лямбдами и многопоточными программами.