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


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


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


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


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


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


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


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


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


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



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




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

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

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

  

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


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