Разница между вызовом по значению и вызовом по ссылке
Ключевая разница между вызовом по значению и вызовом по ссылке
- В методе «Вызов по значению» исходное значение не изменяется, тогда как в методе «Вызов по ссылке» изменяется исходное значение.
- При вызове по значению передается копия переменной, тогда как при вызове по ссылке передается сама переменная.
- При вызове по значению фактические и формальные аргументы будут создаваться в разных ячейках памяти, тогда как при вызове по ссылке фактические и формальные аргументы будут создаваться в одном и том же месте памяти.
- Вызов по значению — это метод по умолчанию в таких языках программирования, как 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:
- Метод не меняет исходную переменную, поэтому сохраняет данные.
- Всякий раз, когда функция вызывается, никогда не влияйте на фактическое содержимое фактических аргументов.
- Значение фактических аргументов передается формальным аргументам, поэтому любые изменения, внесенные в формальный аргумент, не влияют на реальные случаи.
Преимущества использования метода «Вызов по ссылке»
Плюсы использования метода вызова по ссылке:
- Функция может изменять значение аргумента, что весьма полезно.
- Он не создает повторяющиеся данные для хранения только одного значения, что помогает вам сэкономить место в памяти.
- В этом методе копия аргумента не создается. Поэтому он обрабатывается очень быстро.
- Помогает избежать изменений, сделанных по ошибке.
- Человек, читающий код, никогда не узнает, что значение можно изменить в функции.
Недостатки использования метода «Вызов по значению»
Вот основные минусы/недостатки вызова по методу значения:
- Изменения фактических параметров также могут привести к изменению соответствующих переменных аргументов.
- В этом методе аргументы должны быть переменными.
- Вы не можете напрямую изменить переменную в теле функции.
- Иногда аргумент может быть сложным выражением
- Для одной и той же переменной создаются две копии, что неэффективно использует память.
Недостатки использования метода «Вызов по ссылке»
Вот основные недостатки использования метода вызова по ссылке:
- Сильная ненулевая гарантия. Функция, принимающая ссылку, должна убедиться, что входные данные не равны нулю. Поэтому проверку нуля выполнять не требуется.
- Передача по ссылке делает функцию теоретически нечистой.
- Пожизненная гарантия — большая проблема с рекомендациями. Это особенно опасно при работе с лямбдами и многопоточными программами.