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

5. Адресація; вказівники та динамічні змінні; адресна арифметика; динамічний розподіл пам’яті в мові с.

Вказівник це змінна, яка може містити адресу деякого іншого об'єкта. Ним може бути в найпростішому випадку інша змінна або масив, структура, функція, клас (в C++) тощо.

Синтаксис визначення вказівника: <тип> * <ідентифікатор_вказівника>;

Приклади: int * р_і; // р_і - вказівник на тип int; char * р_с; // р_с - вказівник на тип char

В цих прикладах вказівники поки що не вказують ні на які об'єкти - вони не проініціалізовані.

В мові С для ініціалізації вказівника можна використати один з двох способів:ініціалізація адресою існуючої змінної або ініціалізація адресою динамічно виділеної пам'яті (з допомогою функції malloc (), calloc ()).

Приклади.

int і; int *р_і = &і; // вказівник р_і вказує на і // унарна операція & - взяття адреси

*р_і = 10; // змінній і присвоєно значення 10

++*р_і; // змінна і збільшена на 1

cout « *р_і; // виводимо значення і

Зауваження. У виразі (*рі)++; дужки обов'язкові на відміну від виразу ++*р_і; із-за порядку виконання операцій.

Адресна арифметика

Для будь-яких вказівників на один тип допустимі перевірки на рівність та нерівність їх між собою та присвоєння, а також присвоєння та порівняння з вказівником null. Якщо р1 та р2 - вказівники и на один і той самий масив, то допустимими операціями з ними додатково є такі:

р1 < р2 перевірка: "р1 вказує на елемент масиву з меншим індексом, ніж той, на який вказує р2";

р1 <= р2 перевірка: "р1 вказує на елемент масиву з індексом не більшим, ніж той, на який вказує р2";

р1 > р2 перевірка: "р1 вказує на елемент масиву з більшиміндексом, ніж той, на який вказує р2";

р1 >= р2 перевірка: "р1 вказує на елемент масиву з індексом не меншим, ніж той, на який вказує р2";

р2 - р1 кількість елементів масиву між елементами, що адресуються р2 та р1;

p1 + k вказівник на k-ий елемент масиву, рахуючи вперед від елементу, що адресується р1.

p1 - k вказівник на k-ий елемент масиву, рахуючи назад від елементу, що адресується р1.

Динамічний розподіл пам'яті.

Динамічним розподілом пам'яті керують функції із файлу <stdiib.h> (<cstdlib> у просторі імен std):

void* malloc (size_t size); - виділяє size байтів пам'яті в області Heap і повертає вказівник на початок цієї області або вказівник null, якщо пам'ять невиділена. pi = (int*) malloc (sizeof(int)); // вказівник на 1 елем.

void* calloc (size_t n, size_t size) ; - повертає вказівник на початок області пам'яті, достатньої для збереження n об'єктів розміру size або вказівник null, якщо пам'ять не виділена. p = (int*) calloc(5, sizeof(int));

void* realloc (void* p, size_t size); - змінює розмір пам'яті, на яку вказує вказівник р, на size та повертає вказівник на нову область, або вказівник null, якщо зміна неможлива. Для частини пам'яті розміру, рівному найменшому із старого та нового значень, зміст не зміниться. p_i = (int*) realloc (p_i, 10*sizeof(int));

void free (void* p); - звільняє область пам'яті, на яку вказує вказівник р. free (p);

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]