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

6. Вказівники і структуровані програмні змінні

Використання вказівників з складеними програмними кон­струк­ці­ями є основним в технології ООП. Усі сучасні професійні бібліотеки розробки прикладних програм, такі наприклад як VCL чи OWL, є на­гро­мад­ження вказівників. А тому розглянемо використання вказівників з змінними де­яких основних структурованих типів мови.

С++ допускає створення вказівників на структури і організовувати дос­туп до полів структури, незалежно від того чи це змінна чи фунція, за допомогою операції доступу -> "стрілка", наприклад

Приклад 1.2.7

struct MyStrt {

int i; int Mas[10];

};

main()

{

aбо main() {

MyStrt* pStrt = new MyStrt; MyStrt My;

pStrt->i=1; MyStrt* pStrt=&My;

for(int i=0;i<10;i++){ for(int i=0;i<10;i++){

pStrt->Mas[i]=i; pStrt->Mas[i]=i;

} }

} }

Якщо замість вказівника використовувати посилання, то оператор доступу -> "стрілка" треба замінити на оператор доступу . "крапка".

Подібно до структур організовуються вказівники на класи та об'єднання.

Пастка! Спробуйте знайти помилку в наведеній нижче програмі:

#include <stdio.h>

int *po;

void SomeFunction();

{

int n;

n = 25;

// зробити po вказівником на n:

po = &n;

}

void main()

{

SomeFunction(); // зробити po вказівником на що-небудь

// чому це не спрацьовує?

printf("Значення *po: %d\n", *po);

}

Спочатку ця програма викликає функцію SomeFunction, яка створює змінну n, а потім робить po вказівником на неї. Однак є одна проблема. Коли функція завершується, локальні змінні функції видаляються. Локальні змінні завжди видаляються коли виходять з області бачення. Це означає, що коли SomeFunction повертає значення до main() то змінна знищується.

Таким чином po вказує на змінну, яка вже не належить програмі. Якщо ви не розумієте це, потрібно почитати про локальні та глобальні змінні, а також про область бачення. Ця концепція також важлива.

І так, як можна вирішити проблему? Відповідь полягає у використанні методу, відомого як динамічний розподіл. Пам’ятайте, що між С і С++ є різниця. Так як більшість розробниців на даний момент використовують С++, його діалект ми і використаємо нижче.

9. Вказівники типу far

З метою економії пам'яті у вказівниках, які використовуються в ОС з сегментованою пам'яттю зберігається лише зміщення відносно по­чат­ку даного сегменту. Такий тип вказівника називається близьким і є ти­пом по замовчуванні, або оголошується шляхом використання заре­зер­вованого слова near.

Окрім near-вказівників С++ підтримує далекий тип вказівників (або вказівники типу far), який дає змогу зберігати повну ін­формацію про адресацію (сегмент+зміщення). Загальний синтаксис ого­лошення далеких вказівників має вигляд

[const] type* far pointerName[=address];

Незалежно від типу на які посилаються вказівники для near-вказівників виділяється одна цілочисельна комірка пам’яті розміром два байти; для far-вказівників - дві комірки, тобто 4 байти.

Основне призначення far-вказівників, це звертання до так званих да­леких адрес - адрес, які можуть бути визначені лише явним зберігання пари сегмент+зміщення.