- •1 Основні відомості про вказівники
- •2. Вказівники та посилання
- •Void function_a (char*, int, short*);
- •Int *pi; /* вказівник-змінна на дані типу int */
- •3. Ініціалізація вказівника
- •4. Розіменування та присвоєння
- •5. Void-вказівник
- •6. Операція пересування вказівника
- •7. Використання вказівників з модифікатором const
- •8. Деактивації дії модифікатора
- •9. Подвійний вказівник
- •10. Вказівники і масиви
- •11. Доступ до ділянок динамічної пам'яті
- •12. Звільнення пам'яті
- •8. Операції з вказівниками
- •Int I, *pi; /* pi –змінна-вказівник */
- •13. Динамічні масиви
- •11. Посилання
- •Лабораторный практикум
- •Вопросы без ответов
- •3 Основні операції над вказівниками
- •4 Багаторівнева непряма адресація
- •5 Операції над вказівниками
- •Void main ()
- •Void main()
- •6 Проблеми, пов'язані з вказівниками
- •Int *х; /* змінній-покажчику 'х' виділена оп, але 'х' не містить значення адреси оп для змінної */
- •Int *х; /* х - ім'я покажчика, він одержав оп*/
- •Void main ()
- •9 Масиви
- •1.9.1 Основні поняття
- •Int а[5]; /* оголошення зовнішнього масиву */ main ()
- •9.2 Оголошення та звертання в одновимірних масивах
- •9.3 Оголошення та звертання до багатовимірних масивів
- •Int а[3][4]; /* а - вказівник-константа */
- •10 Масиви покажчиків
- •10.1 Робота з великими масивами
- •Void main()
- •Int *p[200], I, j; clrscr() ;
- •10.2 Вільні масиви та покажчики
- •11 Символьні рядки
- •11.1 Основні відомості про представлення рядків
- •11.2 Функції роботи з рядками
- •1. Функції введення рядків.
- •2. Функції виведення рядків.
- •14 Лекція №14
- •14.1 Вказівники Лекція № 2 - Вказівники та посилання
- •1.2.1. Вказівники
- •6. Вказівники і масиви
- •6.1. Вказівники і адреси
- •6.2. Вказівники і аргументи функцій
- •6.3. Вказівники і масиви
- •6.4. Адресна арифметика
- •6.5. Вказівники символів і функції
- •6.6. Вказівники – не цілі значення
- •6.7. Багатовимірні масиви
- •6.8. Масиви вказівників (вказівники на вказівники)
- •6.9. Ініціалізація масивів вказівників
- •6.10. Вказівники і багатовимірні масиви
- •6.11. Командний рядок аргументів
- •6.12. Вказівники на функції
- •Посібник для початківця про вказівники
- •6. Вказівники і структуровані програмні змінні
- •9. Вказівники типу far
- •10. Вказівники і динамічні змінні (керування пам'яттю)
- •9. Вказівники типу far
- •10. Вказівники і динамічні змінні (керування пам'яттю)
- •8. Вказівники і динамічні змінні (керування пам'яттю)
- •Void* operator new(size_t t)
- •Void operator delete(void* p)
- •Void main()
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-вказівників, це звертання до так званих далеких адрес - адрес, які можуть бути визначені лише явним зберігання пари сегмент+зміщення.
