Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lab-04_робота з памятюC++.DOC
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
409.09 Кб
Скачать

Комп’ютерний практикум №4 Робота з пам’яттю

Ключові слова: області пам’яті, доступні програмам на С++ та їх призначення; засоби С++ для роботи з пам’яттю; вказівники та їх природа; адресна арифметика; створення динамічних масивів.

Мета роботи: отримати навички роботи з вказівниками, посиланнями та динамічними масивами.

4.1. Теоретичні відомості Вказівники

У мові С++ є операція визначення адреси — &, за допомогою якої визначаються адреси комірки пам’яті, що містить задану змінну. Наприклад, якщо vr — ім’я змінної, то &vr — адреса цієї змінної.

У С++ також існують і змінні типу вказівник.

Вказівник — це тип даних, який використовується для зберігання адрес змінних і об'єктів.

Значенням змінної типу вказівник є адреса змінної або об'єкта.

Опис змінних типу вказівник здійснюється за допомогою операторів наступної форми:

<тип> *<ім'я вказівника на змінну заданого типу>;

Приклад. Опис вказівників.

int *ptri; //вказівник на змінну цілого типу

char *ptrc; //вказівник на змінну символьного типу

float *ptrf; //вказівник на змінну з плаваючою комою.

Такий спосіб оголошення вказівників виник внаслідок того, що змінні різних типів займають різну кількість комірок пам'яті. При цьому для деяких операцій з вказівниками необхідно знати об'єм відведеної пам'яті. Однак самі змінні типу вказівник мають однаковий розмір.

Нехай змінна типу вказівник має ім'я ptr (тобто оголошена змінна int* ptr), тоді в якості значення їй можна присвоїти адресу за допомогою наступного оператора:

ptr=&vr;

Наприклад:

int vr = 1;

int* ptr = &vr; // ptr містить адресу змінної vr

У мові С++ при роботі з вказівниками велике значення має операція непрямої адресації (розіменування вказівника) — *. Операція * дозволяє звертатися до змінної не напряму, а через вказівник, який містить адресу цієї змінної. Ця операція є одномісною і має асоціативність зліва на право. Цю операцію не слід плутати з бінарною операцією множення. Нехай ptr — вказівник, тоді *ptr — це значення змінної, на яку вказує ptr. Для вищенаведеного прикладу:

int *ptr; // оголошення змінної типу вказівник

*ptr=1; // розіменування вказівника (значення

//змінної vr, на яку вказує вказівник)

Операція * у деякому розумінні є оберненою до операції &.

Приклад [0]:

int a = 1, b;

int* ptr = &a; //містить адресу змінної a

cout << “ Змінна a = ” << (*ptr) << “зберігається за адресою ” << ptr;

b = ptr; // помилка: вказівник не перетворюється у ціле число

b = *ptr + 1; // b = 2

Посилання

Посилання (reference) являє собою видозмінену форму вказівника, яка використовується в якості псевдоніму (іншого імені) змінної. У зв'язку з цим посилання не потребують додаткової пам’яті. Для визначення посилання використовують символ & (амперсант), який ставитися перед змінною-посиланням.

Змінні типу посилання можуть використовуватися в наступних цілях:

  • замість передачі у функцію об'єкта за значенням;

  • для визначення конструктора копії;

  • для перевантаження унарних операцій;

Приклад . Використання посилань

#include <iostream>

using namespace std;

int main()

{

int t = 13,

int &r = t;// ініціалізація посилання на t

// тепер r синонім імені t

cout << "Початкове значення t:" << t; // виводить 13

r += 10; // зміна значення t через посилання

cout<<"\n Остаточне значення t:" << t; // виводить 23

return 0;

}

У даному випадку ми використовували посилання в якості псевдоніму змінної. У цій ситуації воно називається незалежним посиланням (independent reference) і повинно бути ініціалізоване на час оголошення. Такий спосіб використання посилань може призвести до фатальних помилок, які важко виявити через виникнення плутанини у використанні змінних.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]