- •Оператори циклу
- •Адреси даних. Вказівники. Динамічна пам'ять
- •1.Адреси даних.
- •2. Вказівники.
- •3. Динамічна пам’ять.
- •4. Ініціалізація вказівників.
- •Операції з вказівниками.
- •Типові помилки програмування при роботі з вказівниками.
- •5. Посилання
- •Типові обмеження та помилки програмування при роботі з посиланнями.
4. Ініціалізація вказівників.
1. Присвоєння вказівнику адреси існуючого об’єкта
а) &
int a=5;
int *p=&a;
або int *p(&a);
б) за допомогою іншого ініціалізованого вказівника. У випадку вказівника на вказівник, перший вказівник містить адресу другого вказівника, який в свою чергу містить адресу комірки пам’яті, в якій міститься деяке значення int **pp=&p;
в) за допомогою імені масиву або функцій, які трактуються як вказівники
int b[10];
int *t=b;
void f(int a) {…};
void (*pf) (int);
pf=f;
2. Присвоєння вказівнику адреси ділянки пам’яті явним чином:
char *vp=(char*)0xB8000000;
3. Присвоєння вказівнику порожнього значення
int *s = NULL;
int*r = 0; як ціла константа
4. Виділення ділянки динамічної пам’яті і присвоєння її адреси вказівнику
С++ : int *n=new int;
int *m=new int(10); // ініціалізатор для динамічної змінної, на яку вказує m
або *m=10;
int *q=new int [10]; // масив
....
delete n; delete m;
delete q[];
C : int *n = (int *) malloc;
(sizeof (int));
free(n);
Приклад: int *(*p[10]) (); // масив і 10 вказівників на функції типу int *
Операції з вказівниками.
Над вказівниками визначені арифметичні операції та операції порівняння, описані в табл.
Операція |
Приклад і пояснення |
==, !=, >=, <=, >, < |
Порівняння значення двох вказівників (адреси, на які вони вказують). Наприклад, якщо вказівники вказують на одне і те ж саме дане, то результатом порівняння vk1 == vk2 буде істина, інакше – фальш |
– |
vk1 – vk2. Використовується для визначення кількості елементів, які наявні між двома вказівниками |
+, – |
vk1 + k, vk1 – k. Знаходить вказівник, який зміщений відносно даного на k одиниць. |
++ |
Інкремент |
– – |
Декремент |
Докладніше див. Лабораторна робота 4 (розділ – робота з вказівниками)
Типові помилки програмування при роботі з вказівниками.
Використання арифметичних дій з вказівниками, що посилаються не на елементи масиву.
Віднімання або порівняння двох вказівників, що посилаються на елементи не одного масиву.
Вихід за межі масиву при використанні арифметичних дій з вказівниками.
Присвоювання вказівника одного типу вказівнику іншого типу (відмінного від void*) викликає синтаксичну помилку.
Розіменування вказівника на void*.
5. Посилання
Посилання – це синонім імені, вказаного при ініціалізації посилання.
Формат опису <тип> &<ім’я>
Приклад. int k; int &h = k;
Посилання – це розіменований вказівник. Тобто, h – альтернативне ім’я для k. Посилання, на відміну від вказіника, не займає додаткової пам’яті і є просто іншим іменем величини. Посилання обов’язково слід присвоювати при описі.
Типові обмеження та помилки програмування при роботі з посиланнями.
Обмеження:
Не можна взяти адресу змінної типу посилання.
Забороняється використовувати масиви посилань
Не допускаються посилання на бітові поля.
Не можна створити вказівник на посилання.
Помилки:
При оголошенні множини посилань & не вказується для кожного посилання.
При оголошенні змінна-посилання на ініціалізована.
Спроба присвоїти попередньо оголошене посилання як псевдонім іншої змінної.
Повернення вказівника або посилання автоматичній змінній у функцію, яку викликають.