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

13. Динамічні масиви

Динамічні масиви створюються за допомогою операції new, при цьому потрібно вказати тип і розмірність. Розмірність динамічного масиву може бути змінною (тобто визначатися на етапі виконання програми). Доступ до елементів динамічного масиву здійснюється так само як і до елементів статичних масивів.

Приклад 27

#include <windows.h>

#include <clocale>

#include <iostream>

int main()

{

setlocale (LC_CTYPE,"rus");

const unsigned int row=10;

const unsigned int col=10;

int** arfl; //оголошення матриці

arfl = new int*[row];

for (int i=0; i<row; i++)

{

arfl[i] = new int [col];

for (int j=0; j<col; j++)

arfl[i][j]=i+j;//ініціалізація масиву елементів

}

system("pause");

return 0;

}

!!!Реалізувати друкування масиву

Приклад 28

#include <windows.h>

#include <clocale>

#include <iostream>

#include <conio.h>

int main()

{

setlocale (LC_CTYPE,"rus");

int n;

long int s;

std::cout<<"Розмiр масиву=";

std::cin>>n;

int *a=new int [n];

for (int i=0;i<n;i++)

{

std::cout<<"a["<<i<<"]=";

std::cin>>a[i];

}

s=0;

for (int і=0;і<n;і++) s+=a[і];

std::cout<<"Сума елементiв="<<s<<std::endl;

delete [] a;

system("pause");

return 0;

}

Скомпілюйте наведений приклад.

11. Посилання

Змінні-посилання (references) є окремим різновидом вказівників і також містять адресу іншої змінної. Посилання є альтернативним іменем об’єкта.

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

Така сучасна мова програмування як Java взагалі використовує іх взамін вказівників. В С# посилання є основою адресації, в той час як ви­користання вказівників - не рекомендований розробником спосіб. Це зу­мовлено тим, що посилання за своєю суттю є безпечним константим вказівником.

На відміну від вказівників:

  • посилання обов'язково ініціалізуються при оголошенні;

  • посиланням не можна присвоювати нову адресу;

  • посилання не займає зайвої пам’яті і може знищуватись раніше самого об’єкта, на яке воно організоване;

  • стосовно посилань не можна застосовувати операцію знаходження адреси (це стосується окремих С++ компіляторів);

  • не можна створювати масив посилань;

  • для посилань є зайвою операція розіменування; ними оперують як звичайними змінними.

int& i=2; int j=3;

i = j; // i = 3; посиланнями оперують як звичайними змінними

У даному прикладі показано, що значення за посиланням i змінюється без операції розіменування.

Наступний приклад найкраще ілюструє ідею посилання

Приклад 29

#include <windows.h>

#include <clocale>

#include <iostream>

#include <conio.h>

using namespace std;

int main()

{

setlocale (LC_CTYPE,"rus");

int i = 1;

int * const p1=&i;

int& p2 = i;

/*Модифікатор showbase покаже в якій системі числення виводиться значення змінної. Модифікатор hex всередині вихідного потоку призначений для виведення значень в шістнадцятковому вигляді */

cout<<"Адреса змiнної: "<<showbase<<hex<< &i<<"\n";

cout<<"Адреса посилання: "<<showbase<<hex<< &p2<<"\n";

cout<<"Адреса вказiвника: "<<showbase<<hex<< &p1<<"\n";

system("pause");

return 0;

}

Скомпілюйте наведений приклад.

Результат роботи програми є таким:

інструкції (модифікатори) showbase i hex вказують на те, що виводити результат треба з вказанням системи числення у 16-м форматі. Детальніше про модифікатори розберіться самостійно.

В переважній більшості випадків посилання використовуються трьома способами

  • ·посилання можна передавати у функцію;

  • ·посилання можна повертати з функції. Тут треба бути обережним. Якщо функція повертає посилання, то це повинна бути адреса реально існуючого доступного об’єкта.;

  • ·допускається створення незалежних посилань (independ references), тобто посилань, які є просто іншим іменем змінної.

int j; int& i=j; // i - незалежне посилання

Посилання може посилатись на константу

const int &i = 5;

Оголошення посилання з модифікатором const робить неможливою змі­ну значення, на яке вказує посилання.

Поняття безтипових посилань (void&) не існує.

Використання покажчиків дісталося у "спадок" від мови С. Щоб спростити процес зміни параметрів, С + + вводить таке поняття як посилання. Як ви дізнаєтеся з цього уроку, посилання являє собою псевдонім (або друге ім'я), який ваші програми можуть використовувати для звернення до змінної.

Посилання є псевдонімом

Посилання C + + дозволяє створити псевдонім (або друге ім'я) для змінних у вашій програмі. Для оголошення посилання всередині програми вкажіть знак амперсанда (&) безпосередньо після типу параметра. Оголошуючи посилання, ви повинні відразу ж присвоїти йому змінну, для якої це посилання буде псевдонімом, як показано нижче:

int & alias_name = variable; // Оголошення посилання

Після оголошення посилання ваша програма може використовувати або змінну, або посилання:

alias_name = 1001;

variable = 1001;

Наступна програма створює посилання з ім'ям n і присвоює псевдоніму змінну nu. Далі програма використовує як посилання, так і змінну:

# Include <iostream.h>

void main (void)

{

int nu = 501;

int & n = nu; // Створити посилання

cout << "Змінна nu містить" << nu << endl;

cout << "Псевдонім для nu містить" << n << endl;

n = n + 500;

cout << "Змінна nu містить" << nu << endl;

cout << "Псевдонім для nu містить" << n << endl;

}

Як бачите, програма додає 500 до заслання n. У підсумку програма додає 500 також і до відповідної змінної nu, для якої посилання служить псевдонімом чи другим ім'ям. Коли ви откомпіліруете і запустіть цю програму, на вашому екрані з'явиться наступний висновок:

С: \> SHOW_REF <ENTER>

Змінна nu містить 501

Псевдонім для number містить 501

Змінна nu містить 1001

Псевдонім для nu містить 1001

У загальному випадку використання посилання таким чином, як тільки що було показано, створює труднощі для розуміння. Однак ви побачите, що використання посилань значно спрощує процес зміни параметрів всередині функції.

Оголошення посилання

Посилання C + + являє собою псевдонім (друге ім'я), яке ваші програми можуть використовувати для звернення до змінної. Для оголошення посилання поставте амперсанд (&) відразу ж після типу змінної, а потім вкажіть ім'я посилання, за яким слідує знак рівності і ім'я змінної, для якої посилання є псевдонімом:

float & salary_alias = salary;

ВИКОРИСТАННЯ ПОСИЛАНЬ В ЯКОСТІ ПАРАМЕТРІВ

Основне призначення посилання полягає в спрощенні процесу зміни параметрів всередині функції. Наступна програма REFERENC.CPP присвоює посилання з ім'ям n змінної nu. Програма передає посилання на змінну в функцію change_value, яка присвоює змінній значення 1001:

# Include <iostream.h>

void change_value (int & alias)

{

alias = 1001;

}

void main (void)

{

int number;

int & number_alias = number;

change_value (number_alias);

out << "Змінна number містить" << number << endl;

}

Як ви бачите, програма передає заслання у функцію change_value. Якщо ви розглянете оголошення функції, ви виявите, що change_value оголошує параметр alias як посилання на значення типу int.

void change_value (int & alias)

Усередині функції change_value можете змінювати значення параметра без допомоги покажчика. В результаті зірочка (*) не використовується і операція усередині функції стає легше для розуміння.

Використання коментарів для пояснення посилань усередині ваших програм

Більшість програмістів C + + знайомі з мовою програмування С, і вони звикли використовувати покажчики всередині функції, якщо необхідно змінити значення параметра. У результаті, якщо такі програмісти не бачать покажчики всередині функцій, які використовують посилання, вони можуть припустити, що значення параметрів не змінюються. Для запобігання подібних промахів не забувайте розміщувати кілька коментарів до і всередині функцій, які змінюють параметри за допомогою посилань. У такому випадку програмісти С краще зрозуміють роботу ваших функцій.

Розглянемо другий приклад

В уроці 10 ви використовували наступну функцію для перестановки двох значень з плаваючою точкою:

void swap_values ​​(float * a, float * b)

{

float temp;

temp = * a;

* A = * b;

* B = temp;

}

Як бачите, функція комбінує змінні-вказівники з перемінними-неуказателямі. Наступна програма SWAP_REF.CPP використовує посилання на значення з плаваючою точкою для спрощення функції:

# Include <iostream.h>

void swap_values ​​(float & a, float & b)

{Float temp;

temp = a;

a = b;

b = temp;

}

void main (void)

{Float big = 10000.0;

float small = 0.00001;

float & big_alias = big;

float & small_alias = small;

swap_values ​​(big_alias, small_alias);

cout << "Big містить" << big << endl;

cout << "Small містить" << small << endl;

}

Як бачите, функцію swap_values ​​зараз легше зрозуміти, однак ваша програма має тепер два додаткових імені (посилання big_alias і small_alias), за якими ви повинні стежити.

ПРАВИЛА РОБОТИ СО ПОСИЛАННЯМИ

Посилання не є змінною. Один раз присвоївши значення посиланню, ви вже не можете її змінити. Крім того на відміну від покажчиків ви не можете виконати наступні операції над посиланнями:

• Ви не можете отримати адресу посилання, використовуючи оператор адреси C + +.

• Ви не можете привласнити посиланню покажчик.

• Ви не можете порівняти значення посилань, використовуючи оператори порівняння C + +.

• Ви не можете виконати арифметичні операції над посиланням, наприклад додати зсув.

• Ви не можете змінити посилання.

У міру використання об'єктно-орієнтованого програмування на C + + ви повернетеся до посилань.

Використання посилань для зміни параметрів функції

З уроку 10 ви дізналися, що ваші програми за допомогою покажчиків можуть змінювати значення параметрів всередині функції. Для зміни параметра ви повинні передати його адресу в функцію. Щоб отримати адресу параметра, використовуйте оператор адреси C + + (&). У свою чергу функція використовує змінні-вказівники (які зберігають адресу пам'яті). Для оголошення змінної-покажчика всередині функції випереджається ім'я параметра зірочкою (*). Щоб змінити або використовувати значення параметра усередині функції, що випереджають кожне звернення до імені цього параметра оператором разименованія C + + (*). На жаль, багато операцій усередині функції комбінують змінні-вказівники і змінні-неуказателі.

Посилання C + + спрощують процес зміни параметрів функції, позбавляючи від операторів, які змішують змінні-вказівники і змінні-неуказателі.

ЧТ0 ВАМ НЕОБХІДНО ЗНАТИ

З цього уроку ви дізналися, як використовувати посилання C + + для створення псевдоніма або другого імені змінної. Використання посилань може спростити функції, що змінюють значення параметрів. З уроку 15 ви дізнаєтеся, що C + + дозволяє вам задавати значення за замовчуванням для параметрів функції. При виклику функції програма може опускати значення одного або кількох параметрів і функція буде використовувати значення за замовчуванням. До вивчення уроку 15 переконайтеся, що ви освоїли такі основні концепції:

Посилання C + + є псевдонімом (або другим ім'ям) змінної.

Для оголошення посилання помістіть знак амперсанда (&) безпосередньо після типу змінної, а потім вкажіть ім'я посилання, за яким слідує знак рівності і ім'я змінної, для якої посилання є псевдонімом.

Якщо ви одного разу привласнили посиланню значення, ви не можете його змінити.

Вам слід поміщати кілька коментарів до і всередині функцій, які використовують посилання для зміни значень параметра, щоб інші програмісти, читають ваш код, відразу звернули, на це увагу.

Надмірне використання посилань може призвести до занадто важкого для розуміння програмного коду.