Різниця між викликом за значенням і викликом за посиланням

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

  • У методі виклику за значенням вихідне значення не змінюється, тоді як у методі виклику за посиланням вихідне значення змінюється.
  • У виклику за значенням передається копія змінної, тоді як у виклику за посиланням передається сама змінна.
  • У виклику за значенням фактичні та формальні аргументи створюватимуться в різних місцях пам’яті, тоді як у виклику за посиланням фактичні та формальні аргументи створюватимуться в одному місці пам’яті.
  • Виклик за значенням є методом за замовчуванням у таких мовах програмування, як 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

Ось основні мінуси/недоліки методу виклику за значенням:

  • Зміни фактичних параметрів також можуть змінити відповідні змінні аргументу
  • У цьому методі аргументи мають бути змінними.
  • Ви не можете безпосередньо змінити змінну в тілі функції.
  • Іноді аргумент може бути складним виразом
  • Є дві копії, створені для однієї змінної, що не є ефективним для пам’яті.

Недоліки використання методу виклику за посиланням

Ось основні недоліки використання методу виклику за посиланням:

  • Сильна ненульова гарантія. Функція, яка приймає посилання, повинна переконатися, що вхідні дані не нульові. Таким чином, нульову перевірку робити не потрібно.
  • Передача за посиланням робить функцію нечистою теоретично.
  • Довічна гарантія є великою проблемою з посиланнями. Це особливо небезпечно при роботі з лямбда-виразами та багатопоточними програмами.