Добавил:
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
1-1 Программирование С++ / метод_лб_ пз_Інформатика.doc
Скачиваний:
5
Добавлен:
31.01.2021
Размер:
699.9 Кб
Скачать

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

// P2_5.CPP застосування покажчиків

#include < iostream>

using namespace std;

Int main ( )

{

int x = 10;

int *px = &x;

cout << " x =" << x << endl;

cout << "*px =" << *px << endl;

x* = 2; // або x = x*2;

cout << " Нове значення* px =" << *px << endl;

*px += 2; // або *px =*px + 2;

cout << " Нове значення* px=, тобто х=" << x << endl;

return 0;

}

Результат виконання програми:

x = 10

*px = 10

Нове значення *px = 20

Нове значення*px, тобто x = 22

Сам покажчик-змінна має свою адресу, тому буде справедливим

наступний запис:

int *pt1, *pt2;

pt1 = (int*) &pt2; // тут покажчику pt1 привласнюється адреса пам'яті,

// де розташована змінна pt2

Це має сенс у ситуації, коли :

int y,*pt1, *pt2 =&y;

pt1 = (int*) & pt2; .

Існують наступні обмеження на використання операції взяття адреси "&":

— не можна визначати адресу константи ( оскільки їй не приділяється комірка пам'яті), тобто неприпустимий запис : vp = &345;

— не можна визначати адресу результату арифметичного виразу, тому наступний запис невірний : vp = & (x + y); .

Для змінних – покажчиків дозволені операції:

присвоювання;

інкремент і декремент;

додавання і віднімання;

порівняння покажчиків однакового типу.

Наприклад, демонстраційна програма з використанням змінних-покажчиків може мати вигляд:

//P2_6.CPP використання змінних- покажчиків

#include < iostream>

using namespace std;

Void main ( void )

{

int *ptr1 = (int*)100 ;

int *ptr2 = (int*) 200;

ptr1++;

ptr2 -= 10;

cout << "ptr1=" << ptr1 << endl;

cout << "ptr2=" << ptr2 << endl;

cout << "ptr2 - ptr1=" << ptr2 - ptr1 << endl;

}

Результат виконання програми :

ptr1 = 00000068

ptr2 = 000000A0

ptr2 - ptr1 = 14

У програмі операція ptr1++ збільшить адресу на 4 байта , оскільки дані типу int займають 4 байти , операція ptr2-=10 зменьшує адресу на 40 байтів. Адреси виводяться на екран в шістнадцятковому вигляді.

2.4 Використання масивів і покажчиків

У мові С++ масиви і покажчики зв'язані між собою. При оголошенні масиву у вигляді : int mas [20]; ім'я масиву mas визначається як покажчик-константа на перший (нульовий) елемент масиву, тобто на адресу першого елемента масиву &mas[0].

Для доступу до елементів масиву існує два способи:

— використання індексу елемента масиву, наприклад, mas[2] або mas[i];

— використання адресного виразу тобто виразу з покажчиком на

масив, наприклад, *( mas +2 ) чи *( mas+i ).

Ім'я масив-покажчик, можна записати в наступному вигляді:

int mas [20];

int *ptr1;

ptr1 = mas; // чи ptr1 = &mas[0];

Після оголошення масиву int mas [20]; вираз &mas[0] і mas є еквівалентними.

Для обнуління елементів оголошеного масиву досить ініціалізувати його перший елемент: int mas[10] = {0} ; При цьому першому елементу не обов'язково привласнювати значення 0. Якщо в оголошеному масиві ініціалізується трохи перших елементів, то інші ініціалізуються нулями.

Наприклад, у випадку коли float mas [10] ={ 12.2, 34.56 }; , останні вісім елементів одержать значення 0.

Глобальні масиви автоматично ініціалізуються двійковими нулями, у тому числі і символьні.

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

< тип > < ім'я > [n] // Оголошення одновимірного

// масиву з n елементів

< тип > < ім'я > [n] = { значення } // Значення елементів масиву

< тип > < ім'я > [ ] = { значення } // розділені комою

Наприклад:

float m[6];

float m[6] = { 3.4, 4.5, 5.6, 6.7, 8.9, 10.3 };

float m[ ] = { 3.45, 4.56, 5.67, 6.78 };

Двовимірні і багатовимірні масиви описуються аналогічним образом, тобто правомірний запис :

int mas [2][5] ={ 1, 2, 3, 4, 5,

10, 11, 13, 14, 25 };

int mas [2][5] ={ {1, 2, 3, 4, 5},

{10, 11, 13, 14, 25} };

int mas [ ][5] ={ 1, 2, 3, 4, 5,

10, 11, 13, 14, 25 }; .

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

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

Оскільки для масивів завжди в пам'яті приділяється суцільний блок комірок пам'яті, у яких розташовуються елементи, то адресу наступного елемента mas[1] можна вказати шляхом збільшення покажчика на 1, тобто якщо p = &mas[0] , тоді p=p + 1 або ( p += 1) а для i елемента масиву адреса може бути визначена як p + i; . При цьому автоматично виконується операція збільшення адреси з урахуванням типу масиву і кількості, що відводиться, байт для кожного його елемента, отже :

адреса х[і] = адреса x[0] + і*sizeof ( тип ); .

Якщо два покажчики р1 і р2 указують на елементи одного масиву, то до них застосовні операції відносини: == , != , < , <= , > , >= .

Наприклад, відношення вигляду р1 < р2 істинно, якщо р1 указує на більш ранній елемент, ніж р2 . Всякий покажчик можна порівняти з нулем.

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

р + n ; ,

де n — ціле значення, а р — покажчик.

Цей вираз визначає область об'єкта, що займає n -те місце після об'єкта, на який указує р, при цьому n автоматично збільшується на коефіцієнт,що дорівнює відповідній довжині об'єкта. Наприклад , якщо int займає 4 байти , то цей коефіцієнт дорівнює чотирьом.

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

Наприклад, якщо р1< p2, то р2 - р1+1 — це число елементів масиву від р1 до р2 включно.

Таким чином, з покажчиками допускаються наступні операції :

— присвоювання значення одного покажчика іншому;

— додавання і вирахування покажчиків і даного цілого типу ( р+5 );

—порівняння двох покажчиків, що посилаються на елементи одного масиву;

— присвоювання покажчику нуля і порівняння з нулем.

Інші операції з покажчиками заборонені.

Для покажчика дозволяються вирази вигляду:

р1 = mas; або р++ ,

тут р — покажчик , mas — масив.

Розглянемо демонстраційні приклади програм роботи з покажчиками.