Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Вказівники та посилання.docx
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
857.42 Кб
Скачать

Посібник для початківця про вказівники

Загальні питання та відповіді Питання: Чому я отримую помилку "невизначений символ" (symbol undefined) в операторах new і delete? Відповідь: найімовірніше, це відбувається тому, що ваш вихідний код інтерпретується компілятором як написаний на мові Cі. Оператори new та delete є новими можливостями мови C++. Ситуацію зазвичай можна виправити, вказавши для вихідних файлів розширення *.cpp замість *.c Питання: Яка різниця між new і malloc? Відповідь: Оператор new існує тільки в мові C++ і є стандартним (за винятком особливих функцій у Windows) способом виділення пам'яті. Ви не повинні використовувати оператор malloc в C++, хіба що в разі крайньої необхідності. Оскільки malloc не був розроблений для об'єктно орієнтованих можливостей мови C++, його використання для виділення пам'яті для класів призведе до того що конструктор класу викликаний не буде, як приклад того, які проблеми можуть виникнути. У результаті проблем, які виникли при використанні malloc і free, а також тому що вони застаріли для будь-якого використання (в мові C++), в цій статті вони не обговорюються детально. Я не схвалюю використання цих функцій. Питання: Чи можу я використовувати free і delete разом? Відповідь: Ви повинні звільнити пам'ять еквівалентною процедурою до тієї, якою ви виділили пам'ять. Наприклад, використовувати free для роботи з пам’яттю, що виділена через malloc, і delete дя пам'яті, яка виділена з допомогою new і так далі. Посилання Посилання знаходяться поза темою цієї статті. Але оскільки мене дуже часто запитували про посилання люди які читали цю статтю, я опишу їх коротко. Посилання дуже схожі з вказівниками й у більшості випадків вони можуть бути використані як альтернатива вказівникам. Як ви пам'ятаєте я вже писав, що амперсанд (&) читається при оголошенні як "адреса змінної...". У разі присутності амперсанда в оголошенні в тому вигляді який показаний нижче - його слід читати як "посилання на змінну...". int& Number = myOtherNumber; Number = 25; Посилання це те ж саме що і вказівник на myOtherNumber, за виключенням того, що посилання автоматично розіменовується. Таким чином посилання веде себе як змінна зі значенням а не як змінна з адресою (як індикатор). Ідентичний за змістом код, використовуючи вказівники показаний нижче: int* pNumber = &myOtherNumber; *pNumber = 25; Інша відмінність між вказівниками та посиланнями це те, що ви не можете "скинути" посилання. Це означає що не можна змінювати значення адреси посилання після того, як вона була ініціалізована. Наприклад, код нижче виведе "20": int myFirstNumber = 25; int mySecondNumber = 20; int &myReference = myFirstNumber; myReference = mySecondNumber; printf("%d", myFristNumber); Якщо посилання використати в класі, то значення посилання повинне бути встановлено за допомогою конструктора в такий спосіб:

CMyClass::CMyClass(int &variable) : m_MyReferenceInCMyClass(variable)

{

// тут код конструктора

}

Висновки Цю тему дуже важко освоїти на початковому етапі, тому її варто подивитися принаймні двічі: більшість людей не може зрозуміти це відразу. Ось основні моменти ще раз: - Вказівники являють собою змінні, що вказують на область у пам'яті. Ви визначаєте вказівник, додавши зірочку (*) перед ім'ям змінної (тобто int * number). - Ви можете отримати адресу будь-якої змінної додавши перед нею & (амперсант), тобто: pNumber = &my_number; - Зірочка при оголшенні змінної (наприклад int * number), читається як "адреса пам’яті, на яку вказує...". - Амперсанд при оголошенні змінної (наприклад int &number), читається як "адреса ..." - Ви можете виділити пам’ять за допомогою ключового слова new. - Вказівники ПОВИННІ бути того ж типу, що і змінні, на які ви хочете, щоб вони вказували, тому int *number не буде вказувати на MyClass. - Ви можете передати вказівники в функцію. - Ви повинні звільняти пам’ять, яку ви виділили, використовуючи ключове слово delete. - Ви можете отримати вказівник на масив, якщо він вже існує, використавши &array[0];. - Ви повинні видалити масив, який був виділений динамічно використавши delete[], а не просто delete. - Це не абсолютно повне керівицтво по работі з вказівниками. Є ще багато речей, які я міг би розповісти більш детально, такі як вказівники на вказівники, і теми, яких я не торкнувся взагалі, наприклад, вказівники на функції, які занадто важкі для цієї статті. Також є речі, які використовуються дуже рідко, і для початківців буде краще, щоб вони не збивали з пантелику великою кількістю деталей. От і все! Спробуйте запустити деякі програми, представлені тут і придумайте декілька власних прикладів.