Огляд основної термінології
Різні мови комп'ютера мають різні позначення, щоб повідомити компілятору або інтерпретатору, що ви тепер зацікавлені в зазначеному значенні - я фокусируюсь нижче на C і С ++.
сценарій покажчика
Розглянемо в C, вказавши покажчик, такий як p нижче.
розіменування покажчика
Щоб посилатися на символи p на точку, ми розшукуємо p з використанням однієї з цих позначень (знову ж для C):
Ви також можете переміщати покажчики по загостреним даними, розігруючи їх по ходу:
Якщо у вас є дані, які можуть бути записані, ви можете зробити наступне:
Виявлення разименованія і доступ до члена даних структури
У C, якщо у вас є змінна, яка є покажчиком на структуру з елементами даних, ви можете отримати доступ до цих елементів, використовуючи оператор -> разименованія:
Багатобайтові типи даних
Щоб використовувати покажчик, комп'ютерна програма також має потребу в деякому розумінні типу даних, на які вказує - якщо для цього типу даних потрібно більше одного байта для подання, тоді покажчик зазвичай вказує на молодший байт в Дані.
Отже, дивлячись на дещо складніший приклад:
Покажчики на динамічно виділену пам'ять
В С ++ виділення пам'яті зазвичай виконується за допомогою оператора new і звільнення з допомогою delete:
Див. Також інтелектуальні покажчики С ++ нижче.
Часто покажчик може бути єдиною ознакою того, де в пам'яті зберігаються деякі дані або буфер. Якщо потрібне постійне використання цих даних / буфера або можливість виклику free () або delete. щоб уникнути витоку пам'яті, тоді програміст повинен працювати з копією покажчика.
або ретельно спланувати скасування будь-яких змін.
В С ++ найкраще використовувати об'єкти smart pointer для зберігання покажчиків і управління ними, Автоматично звільняючи їх, коли працюють деструктори інтелектуальних покажчиків. Оскільки С ++ 11 стандартна бібліотека надає два, unique_ptr. коли є Один власник для виділеного об'єкта.
нульові покажчики
В C і С ++, так само як вбудовані числові типи не обов'язково мають значення за замовчуванням 0. а не від bools до false. покажчики не завжди рівні NULL. Всі вони встановлені в 0 / false / NULL, якщо вони є static змінними або (тільки С ++) прямими або непрямими змінними-членами статичних об'єктів або їх баз або проходять нульову ініціалізацію (наприклад, new T (); і new T (x , y, z); виконують нульові -ініціалізація на членах T, включаючи покажчики, тоді як new T, нема).
Більш строго, початкові покажчики зберігають біт-шаблон, що ідентифікує або NULL. або (часто віртуальний).
Наприклад, int *. правильно ініціалізований, щоб вказувати на змінну int. може - після кастингу до float * - отримати доступ до значення в пам'яті «GPU», абсолютно відмінному від змінної int. а потім після натискання До покажчика функції може ставитися до окремої пам'яті, що містить коди операцій для функції.
Мови програмування 3GL, такі як C і С ++, як правило, приховують цю складність, наприклад:
Якщо компілятор дає вам покажчик на змінну або функцію, ви можете розігрувати її вільно (до тих пір, поки змінна не буде зруйнована / звільнена між тим), і це проблема компілятора, наприклад, наприклад. Необхідно заздалегідь відновити певний регістр ЦП або використовувати окрему командну інструкцію комп'ютера
Спроби перемістити юридичні покажчики за межі цих кордонів або привласнити довільні числа вказівниками або використовувати покажчики, які стосуються непов'язаним типам, зазвичай мають невизначений поведінка. тому цього слід уникати в бібліотеках і додатках вищого рівня, але для коду ОС, драйверів пристроїв і т.д. Можливо, доведеться покладатися на поведінку зліва Undefined за допомогою C або С ++, які ніколи не були точно визначені їх конкретним обладнанням.
Операція разименованія починається з Покажчик і слід за його стрілкою над Для доступу до його вказівником. Мета може бути Дивитися на стан плацдарму або на Змініть стан плацдарму. Операція разименованія покажчика Працює тільки в тому випадку, якщо покажчик має Pointee - точка повинна бути Виділено і покажчик повинен бути встановлений Вказати на це. Найпоширеніша помилка У коді покажчика забувається встановити Вгору по пункту. Найпоширеніший Через цю помилку в Код є невдалим разименованія операція. В Java невірно Разименовать ввічливо За системою часу виконання. У скомпільованому Такі мови, як C, С ++ і Pascal, Неправильне розіменування Іноді збій, і інші часи Пошкоджена пам'ять в деяких тонких, випадкових шлях. Помилки покажчика в скомпільованому Мови можуть бути важко відстежити З цієї причини.
У простих словах розіменування означає доступ до значення з певного місця пам'яті, на яке вказує цей покажчик.
Проте, ми можемо разименовать покажчик без Доступ до значення, на яке він вказує. наприклад:
Ми разименовалі покажчик NULL без доступу до його вартість. Або ми могли б зробити:
Знову разименовивается, але ніколи не звертається до значення. Такий код НЕ буде аварійно: Аварія відбувається, коли ви насправді отримуєте доступ до даних Невірний покажчик. Однак, на жаль, згідно Стандартне розіменування недійсного покажчика є невизначеним (За деякими винятками), навіть якщо ви не намагаєтеся Торкніться фактичних даних.
Коротше кажучи, розіменування покажчика означає застосування Оператор разименованія. Цей оператор просто повертає L-значення для вашого майбутнього використання.