logo

Покажчики проти посилань у C++

Необхідна умова: Покажчики , Список літератури

C і C++ підтримують покажчики, що відрізняється від більшості інших мов програмування, таких як Java, Python, Ruby, Perl і PHP, оскільки вони підтримують лише посилання. Але цікаво, що C++, разом із покажчиками, також підтримує посилання.



Зовні і посилання, і покажчики дуже схожі, оскільки обидва використовуються, щоб одна змінна надала доступ до іншої. Оскільки обидва надають багато однакових можливостей, часто незрозуміло, чим відрізняються ці механізми. У цій статті я спробую проілюструвати відмінності між покажчиками та посиланнями.

Покажчики : Покажчик - це змінна, яка містить адресу пам'яті іншої змінної. Покажчик потрібно розіменувати за допомогою * оператор для доступу до місця пам’яті, на яке він вказує.

Список літератури : Посилальна змінна є псевдонімом, тобто іншою назвою для вже існуючої змінної. Посилання, як і покажчик, також реалізується шляхом зберігання адреси об’єкта.
Посилання можна розглядати як постійний вказівник (не плутати з вказівником на постійне значення!) з автоматичним опосередкуванням, тобто компілятор застосує * оператор для вас.



int i = 3;   // A pointer to variable i or 'stores the address of i' int *ptr = &i;   // A reference (or alias) for i. int &ref = i;>

відмінності :

1. Ініціалізація: Покажчик можна ініціалізувати таким чином:

int a = 10; int *p = &a; // OR  int *p; p = &a;>

Ми можемо оголосити та ініціалізувати вказівник на одному кроці або в кількох рядках.



2. Перебуваючи в посиланнях,

int a = 10; int &p = a; // It is correct // but int &p; p = a; // It is incorrect as we should declare and initialize references at single step>

ПРИМІТКА: Ця різниця може відрізнятися від компілятора до компілятора. Наведена вище відмінність стосується Turbo IDE.

3. Перепризначення: Покажчик можна призначити повторно. Ця властивість корисна для реалізації структур даних, таких як пов’язаний список, дерево тощо. Дивіться наступний приклад:

int a = 5; int b = 6; int *p; p = &a; p = &b;>

4. З іншого боку, посилання не може бути повторно призначено, і має бути призначено під час ініціалізації.

int a = 5; int b = 6; int &p = a; int &p = b; // This will throw an error of 'multiple declaration is not allowed'  // However it is valid statement, int &q = p;>

5. Адреса пам'яті: Покажчик має власну адресу пам’яті та розмір у стеку, тоді як посилання спільно використовує ту саму адресу пам’яті, що й вихідна змінна, і не займає місця в стеку.

int &p = a; cout << &p << endl << &a;>

6. NULL значення: Покажчику можна присвоїти NULL напряму, тоді як посиланню не можна. Обмеження, пов’язані з посиланнями (без NULL, без перепризначення), гарантують, що базові операції не стикаються з винятковою ситуацією.

7. ненаправленість: Ви можете мати вказівник на вказівник (відомий як подвійний вказівник), пропонуючи додаткові рівні опосередкованості, тоді як посилання пропонують лише один рівень опосередкованості. Наприклад,

In Pointers, int a = 10; int *p; int **q; // It is valid. p = &a; q = &p;  // Whereas in references, int &p = a; int &&q = p; // It is reference to reference, so it is an error>

8. Арифметичні дії: Над покажчиками можна виконувати різні арифметичні операції, тоді як такої речі, як еталонна арифметика, не існує (проте ви можете виконувати арифметичні дії вказівників над адресою об’єкта, на який вказує посилання, як у &obj + 5).

мамта кулкарні актор

Таблична форма різниці між посиланнями та покажчиками в C++

Список літератури Покажчики
Перепризначення Змінна не може бути перепризначена в Reference. Змінну можна перепризначити в покажчиках.
Адреса пам'яті Він має ту саму адресу, що й вихідна змінна. Покажчики мають власну адресу пам'яті.
Робота Це стосується іншої змінної. Він зберігає адресу змінної.
Нульове значення Він не має нульового значення. Йому може бути присвоєно значення null.
Аргументи На цю змінну посилається метод передачі за значенням. Покажчик робить це за допомогою методу, відомого як передача за посиланням.

Коли використовувати Що

Виступи точно такі ж, як посилання реалізовані внутрішньо як покажчики. Але все ж ви можете пам’ятати про деякі моменти, щоб вирішити, коли що використовувати:

  • Використовуйте посилання:
    • У параметрах функції та типах повернення.
  • Використовуйте покажчики:
    • Якщо потрібна арифметика вказівника або передача вказівника NULL. Наприклад, для масивів (Зверніть увагу, що доступ до масиву реалізовано за допомогою арифметики вказівника).
    • Для реалізації структур даних, таких як пов’язаний список, дерево тощо, та їхніх алгоритмів. Це тому, що для того, щоб вказувати на різні комірки, ми повинні використовувати концепцію покажчиків.

Цитується в C++ FAQ Lite : Використовуйте посилання, коли можете, і покажчики, коли потрібно. Посиланням зазвичай надають перевагу над покажчиками, коли вам не потрібно переставляти. Зазвичай це означає, що посилання є найбільш корисними в публічному інтерфейсі класу. Посилання зазвичай з’являються на оболонці об’єкта, а вказівники – усередині.

Винятком із наведеного вище є випадки, коли параметр функції або значення, що повертається, потребує контрольного посилання — посилання, яке не посилається на об’єкт. Зазвичай це найкраще зробити, повернувши/взявши покажчик і надавши значенню nullptr це особливе значення (посилання завжди мають бути псевдонімами об’єктів, а не розіменованого нульового покажчика).

Пов'язана стаття:
Коли ми передаємо аргументи як посилання чи покажчики?