МАРК РЕГНЕРУС ДОСЛІДЖЕННЯ: Наскільки відрізняються діти, які виросли в одностатевих союзах
РЕЗОЛЮЦІЯ: Громадського обговорення навчальної програми статевого виховання ЧОМУ ФОНД ОЛЕНИ ПІНЧУК І МОЗ УКРАЇНИ ПРОПАГУЮТЬ "СЕКСУАЛЬНІ УРОКИ" ЕКЗИСТЕНЦІЙНО-ПСИХОЛОГІЧНІ ОСНОВИ ПОРУШЕННЯ СТАТЕВОЇ ІДЕНТИЧНОСТІ ПІДЛІТКІВ Батьківський, громадянський рух в Україні закликає МОН зупинити тотальну сексуалізацію дітей і підлітків Відкрите звернення Міністру освіти й науки України - Гриневич Лілії Михайлівні Представництво українського жіноцтва в ООН: низький рівень культури спілкування в соціальних мережах Гендерна антидискримінаційна експертиза може зробити нас моральними рабами ЛІВИЙ МАРКСИЗМ У НОВИХ ПІДРУЧНИКАХ ДЛЯ ШКОЛЯРІВ ВІДКРИТА ЗАЯВА на підтримку позиції Ганни Турчинової та права кожної людини на свободу думки, світогляду та вираження поглядів Контакти
Тлумачний словник |
|
|||||||
Лекція №5Тема : Поняття вказівника та посилання. Унарні операції, адресна арифметика. Мета:Вивчення поняттів покозчик та посилання, їх особливостей у використанні при роботі з пам’ятю. Питання : 1. Понаття показчики, посилання. 2. Унарні операції. У мові С++ широко використаються дані, які називаються покажчиками. Покажчики — це змінні, які містять адресу пам'яті, розподіленої для інший змінної. Всі змінні, розглянуті дотепер, зберігали якісь значення (дані). Ці дані могли бути різних типів: символьного, цілого, речовинного й т.д. При оголошенні змінної - покажчика необхідно вказати тип даних, адреса яких буде містити змінна, і ім'я покажчика з попередньою зірочкою. Загальний формат опису покажчика наступний: тип * ім'я; де тип — тип значень, на який буде вказувати покажчик; ім'я — ім'я змінн-покажчика; * - означає операцію над типом, що читається "покажчик" на тип. Приведемо приклади визначень покажчиків: int *pn; // покажчик на ціле значення; float *pf1, *pf2 ; // два покажчики на речовинні значення; Покажчики не прив'язують дані до якого-небудь певного імені змінної й можуть містити адреса будь-якого неіменованого значення. Існує адресна константа NULL , що означає "порожній" адресу. У мові С++ є всього два оператори, що ставляться до покажчиків:
“&” — оператор " адреса значення "; “* “ — оператор "значення за адресою".
Оператор "*" , використовуваний разом з покажчиками, витягає значення, на яке вказує змінна, розташована безпосередньо після нього. Оператор "&" , використовуваний разом з покажчиками, повертає адреса змінної, розташованої безпосередньо після нього. Покажчики можна оголосити одним з наступних способів: <тип.> *ptr; <тип> *ptr = <змінна - покажчик>; <тип> *ptr =&<ім'я змінної>; // адреса змінної У програмі це може виглядати в такий спосіб: int *ptx ,b ; float y; // оголошені змінна - покажчик ptx і звичайні змінні b і y; float *sp = &y; // покажчику sp привласнюється адреса змінної y float *p = sp; // покажчику p привласнюється значення (адреса значення), // яке втримується в змінної sp, тобто адреса змінної y. При оголошенні покажчиків символ "*" може розташовуватися або перед ім'ям покажчика або записуватися відразу після оголошення типу покажчика й поширює своя дія тільки на один змінну - покажчик, перед якою він коштує, наприклад: long *pt; long* Uk; int * ki, x, h ; // оголошення описів Якщо буде потреба опису покажчика на осередок довільного типу, замість ідентифікатора типу записується слово void, наприклад:
void *p, *pt; // описані два покажчики на довільний тип даних Перш ніж використати покажчик у програмі, йому обов'язково треба привласнити адресу якого - або даного, тобто проініціалізувати, інакше можуть бути непередбачені результати. Для доступу до значення змінної, адреса якої зберігається в покажчику, досить у відповідному операторі програми записати ім'я покажчика із символом "*" , наприклад:
int *p, *p1; // Оголошені два покажчики на комірку пам'яті int; int x =12, y=5, m [7 ]; // Оголошені змінні x,y і масив m, // змінні x,y мають встановлені значення p = &y; // Покажчику p привласнена адреса змінної y.
Тепер, якщо написати оператор виводу на екран у вигляді : cout << "Адреса р " << p << "Значення по цій адресі= " <<*p; ,
те виведеться адреса комірки пам'яті, де записане змінна y і значення цієї змінної (тобто 5). Використовуючи запис x = *p; , одержуємо x=5, тому що *p = y = 5; . Змінити значення y можна записавши: y = 10; // або *p = 10; і виконавши операцію *p= *p+5; // це відповідає операції y = y + 5; тобто y = 15.
При оголошенні покажчиків, їм потрібно привласнювати початкові значення ( ініціювати), при цьому можна або привласнювати адреса об'єкта (змінної), або адреса конкретного місця пам'яті (масиву), або число 0 (нуль), наприклад: int *pt = (char *) 0x00147; // Привласнюється адреса осередку int *arrpt = new int [10]; // Визначається початкова адреса розміщення // динамічного масиву сhar *p = 0; // Ініціалізація нулем Оскільки покажчики — це спеціальні змінні, то в операціях з іншим покажчиками вони можуть використатися без символу "*", тобто без розкриття посилання, наприклад:
float *pt1, *pt2 , x=15, m[5]; pt1=&x; pt2=pt1; pt1 = m; // або pt1 = &m[0]; m — це ім'я масиву, що в // розглядається як спеціальний покажчик – константа. Наведемо програму з використанням покажчиків: // P2_5.CPP — застосування покажчиків #include < iostream.h > 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.h> void main ( void ) { int near *ptr1 = (int*)100 ; int near *ptr2 = (int*) 200; ptr1++; ptr2 -= 10; cout << "*ptr1=" << *ptr1 << endl; cout << "*ptr2=" << *ptr2 << endl; cout << "*ptr2 - *ptr1=" << *ptr2 -* ptr1 << endl; }
Результат виконання програми : *ptr1 = 102 *ptr2 = 190 *ptr2 - ptr1 = 88 У програмі операця ptr1++ збільшить адресу на 2 байти , оскільки дані типу int займають 2 байти .
Закріплення вивченного матеріалу: Дано наступний фрагмент кода. Виправьте помилки. int* foo(int n) { int *x = (int*)malloc (n*2); // 2 – размерность типа int return x; } …. int main() { int *x = foo(10); std::cout << *x; return 0; } Поясніть чому приведена функція не є коректною. int* foo() { int x=2; return &x; }
Знайдіть помилку у наведеному фрагменті коду # include <stdio.h> int main() { int *pInt; *pInt = 9; printf(“Значение = %d ”, *pInt); return 0; }
Читайте також:
|
||||||||
|