
- •Комп’ютерний практикум №4 Робота з пам’яттю
- •4.1. Теоретичні відомості Вказівники
- •Посилання
- •Способи передачі параметрів у функцію: за значенням та за посиланням
- •Масиви та вказівники
- •Динамічні масиви
- •Приклад. Використовуючи вказівники, вивести на екран масив із заданою кількістю елементів
- •Передача масивів у функції
- •Вказівники на функцію
- •Засоби аналізу продуктивності програм
- •4.2. Порядок виконання роботи
- •4.3. Варіанти завдань
Комп’ютерний практикум №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) і повинно бути ініціалізоване на час оголошення. Такий спосіб використання посилань може призвести до фатальних помилок, які важко виявити через виникнення плутанини у використанні змінних.