Студопедия
Новини освіти і науки:
МАРК РЕГНЕРУС ДОСЛІДЖЕННЯ: Наскільки відрізняються діти, які виросли в одностатевих союзах


РЕЗОЛЮЦІЯ: Громадського обговорення навчальної програми статевого виховання


ЧОМУ ФОНД ОЛЕНИ ПІНЧУК І МОЗ УКРАЇНИ ПРОПАГУЮТЬ "СЕКСУАЛЬНІ УРОКИ"


ЕКЗИСТЕНЦІЙНО-ПСИХОЛОГІЧНІ ОСНОВИ ПОРУШЕННЯ СТАТЕВОЇ ІДЕНТИЧНОСТІ ПІДЛІТКІВ


Батьківський, громадянський рух в Україні закликає МОН зупинити тотальну сексуалізацію дітей і підлітків


Відкрите звернення Міністру освіти й науки України - Гриневич Лілії Михайлівні


Представництво українського жіноцтва в ООН: низький рівень культури спілкування в соціальних мережах


Гендерна антидискримінаційна експертиза може зробити нас моральними рабами


ЛІВИЙ МАРКСИЗМ У НОВИХ ПІДРУЧНИКАХ ДЛЯ ШКОЛЯРІВ


ВІДКРИТА ЗАЯВА на підтримку позиції Ганни Турчинової та права кожної людини на свободу думки, світогляду та вираження поглядів



Контакти
 


Тлумачний словник
Авто
Автоматизація
Архітектура
Астрономія
Аудит
Біологія
Будівництво
Бухгалтерія
Винахідництво
Виробництво
Військова справа
Генетика
Географія
Геологія
Господарство
Держава
Дім
Екологія
Економетрика
Економіка
Електроніка
Журналістика та ЗМІ
Зв'язок
Іноземні мови
Інформатика
Історія
Комп'ютери
Креслення
Кулінарія
Культура
Лексикологія
Література
Логіка
Маркетинг
Математика
Машинобудування
Медицина
Менеджмент
Метали і Зварювання
Механіка
Мистецтво
Музика
Населення
Освіта
Охорона безпеки життя
Охорона Праці
Педагогіка
Політика
Право
Програмування
Промисловість
Психологія
Радіо
Регилия
Соціологія
Спорт
Стандартизація
Технології
Торгівля
Туризм
Фізика
Фізіологія
Філософія
Фінанси
Хімія
Юриспунденкция






Лекція №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;

}

 


 


Читайте також:

  1. Вид заняття: лекція
  2. Вид заняття: лекція
  3. Вид заняття: лекція
  4. Вид заняття: лекція
  5. Вид заняття: лекція
  6. Вступна лекція
  7. Вступна лекція 1. Методологічні аспекти технічного регулювання у
  8. Клітинна селекція рослин.
  9. Колекція фонограм з голосами осіб, які анонімно повідомляли про загрозу вибуху
  10. ЛЕКЦІЯ (4): Мануфактурний період світової економіки
  11. Лекція - Геополітика держави на міжнародній арені
  12. Лекція 02.04.2013




Переглядів: 516

<== попередня сторінка | наступна сторінка ==>
Лекція №4 | Лекція №6

Не знайшли потрібну інформацію? Скористайтесь пошуком google:

 

© studopedia.com.ua При використанні або копіюванні матеріалів пряме посилання на сайт обов'язкове.


Генерація сторінки за: 0.01 сек.