Вказівники, масиви. Структури Проф. Куссуль Н.М.
Вказівники Використовується для посилання на змінні та машинні адреси Для типу Т тип Т* – вказівник на Т Змінна Т* містить адресу обєкту Т int k = 5; int* p = &k; 5&k kp Адреса змінної k
NULL адреса Будь-якому вказівнику можна присвоїти значення 0 Умови: Якщо вичерпана память, оператор new повертає 0 При вказівнику на кінець динамічної структури (список, дерева) int* p=0; //вказує на NULL
Операції з вказівниками Розіменування вказівника Операція непрямої адресації int *a; // оголошення змінної типу вказівник *a=4; // розіменування вказівника
Приклади int i = 5, j; int* p = &i; j = p; //заборонено (вказівник не перетворюється в ціле!) j = *p+1; //j=6 p = &j; //p вказує на j
Адресація Вказівники відображають механізм адресації компютера – доступ до комірок памяті На сьогодні мінімальною одиницею комірки памяті є байт Байт відповідає char
Посилання Посилання (reference) являє собою видозмінену форму вказівника, яка використовується в якості псевдоніму (іншого імені) змінної Посилання не потребують додаткової памяті Для визначення посилання використовують символ & (амперсант), який ставитися перед змінною- посиланням. Змінні типу посилання можуть використовуватися в наступних цілях: замість передачі у функцію об'єкта за значенням; для визначення конструктора копії; для перевантаження унарних операцій;
Масиви Масив – похідний тип даних; Масив - спеціальна форма вказівника, яка звязана з неперервним фрагментом памяті для зберігання індексованих послідовностей значень; int* c; char** ppr; int* ap[15]; //масив з 15 вказівників на int int* f(char*); int (*fp)(char*); //вказівник на функцію
Масиви Для будь-якого типу Т T[size] – масив із size елементів float a[31]; double b[3]; Розмір масиву size повенен бути константою!
Багатовимірні масиви Масив, елементами якого є масиви int d2[10][20]; //матриця 10 на 20 float d3[10][10][10]; //тривимірний масив
Ініціалізатор масиву Список значень int v1[] = {1, 2, 3, 4}; char v2[] = {a, b, 0}; Якщо масив оголошено без вказання розміру, але ініціалізовано списком, то розмір обчислюється автоматично шляхом підрахунку елементів списку! Якщо розмір вкзаується явно, то кількість елементів не повинна перевищувати заданого розміру! char v3[2] = {a, b, 0}; // помилка!
Ініціалізатор масиву (прод.) Якщо в списку недостатньо елементів, інші елементи ініціалізуються нулями! int v[5] = {1, 2, 3}; v[5] = {1, 2, 3, 0, 0}; Не існує присваювання, яке аналогічно ініціалізації: v[3] = {1, 2, 3}; //недопустимо!
Вказівники на масиви Імя масива може використовуватися в якості вказівника на його перший елемент int v[] = {1, 2, 3, 4}; int* p1 = v; int* p2 = &v[0]; int* p3 = &v[4]; 1234 p1p2 p3 v
Двовимірний масив Масив виду A[N][M] int a[4][5]; int* p; *p = a; a[i][j] = 4; *(p+i*M+j) = 4; jM i* N
Двовимірний масив (прод.) Розміщення в памяті pp+1p+2p+3p+4p+5 a[0][0]a[0][1]a[1][0]a[1][1]a[2][0]a[2][1]
Двовимірний масив int** data; data = new int*[N]; // створення рядків for (int j=0; j<N; j++) data[j] = new int[M]; //створення стовпчиків for (int i=0; i<N; i++) for(int j=0; j<M; j++) data[i][j] = i+j; for(int i=0; i<N; i++) delete [] data[i]; //звільнення памяті від кожного рядка delete [] data; //звільнення памяті від масиву
Структура Складений тип, який поєднує різні компоненти в єдину іменованну змінну struct address { char* name; long int number; char* street; char* city; long zip; }; Масив – набір елементів одного типу Структура - набір елементів різних типів
Структура (прод.) Елементи структури наз. членами (members) Вони мають індивідуальні імена! Структури використовуються для створення агрегатів, які підходять для опису складних даних
Оголошення змінної типу структури address jb; jb.name = John Doe; jb.number = 61; Для ініціалізації структури можна використати ініціалізатор масиву: address jb = {James Bond, 61, Arapahot Str., Boulder, CO, 02092};
Доступ до елементів структури Два способи: Крапка: змінна_структури.імя_елемента Вказівник (*вказівник_структури).імя_елемента вказівник_структури->імя_елемента address my; my.number = 116; address* neighbor; neighbor->number = 120; // або (*neighbor).number = 120;
Операції над структурами Доступ до елементів крапка (.), або вказівники (->) Присвоювання (=) Операція порівняння не визначенa! (==, !=, тощо) Структури можна передавати як аргументи функцій address set_cur(address next){ address prev = current; current = next; return prev; }
Приклад: аргумент функції