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

Лабораторна робота № 6 Вказівники та посилання. Динамічні масиви

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

6.1. Теоретичні відомості

Вказівник - це символічне представлення адреси. Він використовується для непрямої адресації змінних і об'єктів.

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

В С++ також існують і змінні типу вказівник. Значенням змінної типу вказівник є адреса змінної або об'єкта. Нехай змінна типу вказівник має ім'я ptr, тоді в якості значення їй можна присвоїти адресу за допомогою наступного оператора:

ptr=&vr;

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

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

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

Кожна змінна в програмі це об'єкт, що має ім'я і значення по імені можна звернутися до змінного й одержати її значення. Оператор присвоювання ( = ) виконує зворотну дію: імені змінної ставиться у відповідність значення.

a=10;

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

Маючи можливість визначити адреси змінної за допомогою &, треба мати можливість працювати з цією адресою: зберігати його, передавати, перетворювати. Для цього вводиться поняття вказівника. Вказівник - це змінна, значенням якої служить адреса об'єкта конкретного типу. Нульова адреса позначається константою NULL, що визначена в заголовному файлі stdio.h. Щоб визначити вказівник треба повідомити на об'єкт якого типу посилається цей вказівник.

char *z;

int *k,*i;

float *f;

* - це операція разіменування. Операндом цієї операції завжди є вказівник. Результат операції - це той об'єкт, що адресує вказівник_операнд.

* z=’$ ‘;

*k=*i=0;

Приклад:

int e, c, b, *m;

. . . . . . . . .

m = &e ;

*m = c + b ;

Операції над вказівниками.

присвоювання (=);

одержання значення об'єкта, на який посилається вказівник (*);

одержання адреси самого вказівника (&).

Приклад:

i nt date = 10;

int *i, *k;;

i = &date;

k = i;

z = NULL;

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

За допомогою унарних операцій ++ і –і числові значення змінних типу вказівник міняються по різному, у залежності від типу даних, з яким зв'язані ці змінні.

Приклад:

char *z;

int *k,*i;

float *f;

. . . . . . .

z++; // значення змінюється на 1

і++; // значення змінюється на 2

f++; // значення змінюється на 4

Тобто при зміні вказівника на 1, вказівник переходить до початку наступного (попереднього) поля тієї довжини, що визначається типом об'єкта, який адресується вказівником.

Ім'я масиву без індексу є вказівником-константою, тобто адресою першого елемента масиву (a[0]).

a

*a = = a[0] ;

*(a+1) = = a[1];

. . . . . . . . .

*(a+і) = =a[і];

Відповідно до синтаксису в С існують тільки одномірні масиви, але їх елементами , у свою чергу, теж можуть бути масиви.

int a[5][5];

Для двовимірного масиву:

a[m][n] = = *(a[m]+n) = = *(*(a+m)+n);

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

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

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

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

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

Вказівники використовуються для роботи з масивами. розглянемо оголошення двовимірного масиву:

int mas[4][2];

int *ptr;

Тоді вираз ptr=mas вказує на перший стовпець першого рядка матриці. Записи mas і &mаs[0][0] рівносильні. Вираз ptr+1 вказує на mas[0][1], далі йдуть елементи: mas[1][0], mas[1][1], mas[2][0] і т. д.; ptr+5 вказує на mas[2][1].

Двовимірні масиви розташовані в пам’яті так само, як і одновимірні масиви, займаючи послідовні комірки пам’яті

ptr

ptr+1

ptr+2

ptr+3

ptr+4

ptr+5

mas[0][0]

mas[0][1]

mas[1][0]

mas[1][1]

mas[2][0]

mas[2][1]

Розміщення двовимірного масиву в пам’яті

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

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

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

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

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

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

#include <iostream.h>// cout

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) і повинно бути ініціалізоване під час оголошення. Такий спосіб використання посилань може призвести до фатальних помилок, які важко виявити через виникнення плутанини у використанні змінних.

Інше застосування посилань - можливість створення параметрів функції, які передаються за допомогою посилання, при цьому перед цим параметром ставиться знак &.

Приклад 3. Функція з параметром-посилання.

#include <iostream.h>// cout

void sqr(int &);// прототип функції

int main()

{

int t = 3;

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

sqr(t);

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

return 0;

}

void sqr(int&x)

{

x*= x;

}

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