Різниця між викликом за значенням і викликом за посиланням
Ключова різниця між викликом за значенням і викликом за посиланням
- У методі виклику за значенням вихідне значення не змінюється, тоді як у методі виклику за посиланням вихідне значення змінюється.
- У виклику за значенням передається копія змінної, тоді як у виклику за посиланням передається сама змінна.
- У виклику за значенням фактичні та формальні аргументи створюватимуться в різних місцях пам’яті, тоді як у виклику за посиланням фактичні та формальні аргументи створюватимуться в одному місці пам’яті.
- Виклик за значенням є методом за замовчуванням у таких мовах програмування, як C++, PHP, Visual Basic NET і C#, тоді як виклик за посиланням підтримується лише в Java мова.
- Змінні виклику за значенням передаються за допомогою прямого методу, тоді як покажчики виклику за посиланням потрібні для зберігання адреси змінних.
У мовах програмування функції можна викликати двома способами: виклик за значенням і виклик за посиланням.
Що таке метод виклику за значенням?
Метод виклику за значенням копіює значення аргументу у формальний параметр цієї функції. Тому зміни, внесені до параметра функції main, не впливають на аргумент.
У цьому методі передачі параметрів значення фактичних параметрів копіюються у формальні параметри функції, а параметри зберігаються в різних місцях пам’яті. Таким чином, будь-які зміни, зроблені всередині функцій, не відображаються на фактичних параметрах програми виклику.
Що таке метод виклику за посиланням?
Метод виклику за посиланням копіює адресу аргументу у формальний параметр. У цьому методі адреса використовується для доступу до фактичного аргументу, який використовується під час виклику функції. Це означає, що зміни, зроблені в параметрі, змінюють передаваний аргумент.
У цьому методі виділення пам’яті таке ж, як і фактичні параметри. Усі операції у функції виконуються зі значенням, що зберігається за адресою фактичного параметра, а змінене значення буде збережено за тією ж адресою.
Приклад коду 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
Оскільки змінна, оголошена 'a' в main(), відрізняється від змінної 'x' в increment(). У цій програмі подібні лише імена змінних, але їх адреси в пам’яті різні та зберігаються в різних місцях пам’яті.
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:
- Метод не змінює вихідну змінну, тому він зберігає дані.
- Щоразу, коли функція викликається, ніколи не впливайте на фактичний вміст фактичних аргументів.
- Значення фактичних аргументів передано формальним аргументам, тому будь-які зміни, зроблені у формальному аргументі, не впливають на реальні випадки.
Переваги використання методу виклику за посиланням
Плюси використання методу виклику за посиланням:
- Функція може змінювати значення аргументу, що дуже корисно.
- Він не створює дублікатів даних для зберігання лише одного значення, що допомагає вам заощадити місце в пам’яті.
- У цьому методі немає копії зробленого аргументу. Тому обробляється дуже швидко.
- Допомагає уникнути помилкових змін
- Людина, яка читає код, ніколи не знає, що значення можна змінити у функції.
Недоліки використання методу Call by value
Ось основні мінуси/недоліки методу виклику за значенням:
- Зміни фактичних параметрів також можуть змінити відповідні змінні аргументу
- У цьому методі аргументи мають бути змінними.
- Ви не можете безпосередньо змінити змінну в тілі функції.
- Іноді аргумент може бути складним виразом
- Є дві копії, створені для однієї змінної, що не є ефективним для пам’яті.
Недоліки використання методу виклику за посиланням
Ось основні недоліки використання методу виклику за посиланням:
- Сильна ненульова гарантія. Функція, яка приймає посилання, повинна переконатися, що вхідні дані не нульові. Таким чином, нульову перевірку робити не потрібно.
- Передача за посиланням робить функцію нечистою теоретично.
- Довічна гарантія є великою проблемою з посиланнями. Це особливо небезпечно при роботі з лямбда-виразами та багатопоточними програмами.