Скачать презентацию Вказівники масиви Структури Проф Куссуль Н М Скачать презентацию Вказівники масиви Структури Проф Куссуль Н М

Lecture5-CPP.ppt

  • Количество слайдов: 22

Вказівники, масиви. Структури Проф. Куссуль Н. М. Вказівники, масиви. Структури Проф. Куссуль Н. М.

Вказівники Використовується для посилання на змінні та машинні адреси Для типу Т тип Т* Вказівники Використовується для посилання на змінні та машинні адреси Для типу Т тип Т* – вказівник на Т Змінна Т* містить адресу об’єкту Т int k = 5; int* p = &k; Адреса змінної k p &k k 5

NULL адреса Будь-якому вказівнику можна присвоїти значення 0 Умови: n n Якщо вичерпана пам’ять, NULL адреса Будь-якому вказівнику можна присвоїти значення 0 Умови: n n Якщо вичерпана пам’ять, оператор new повертає 0 При вказівнику на кінець динамічної структури (список, дерева) int* p=0; //вказує на NULL

Операції з вказівниками Розіменування вказівника n n Операція непрямої адресації int *a; // оголошення Операції з вказівниками Розіменування вказівника n n Операція непрямої адресації int *a; // оголошення змінної типу вказівник *a=4; // розіменування вказівника

Приклади int i = 5, j; int* p = &i; j = p; //заборонено Приклади int i = 5, j; int* p = &i; j = p; //заборонено (вказівник не перетворюється в ціле!) j = *p+1; //j=6 p = &j; //p вказує на j

Адресація Вказівники відображають механізм адресації комп’ютера – доступ до комірок пам’яті На сьогодні мінімальною Адресація Вказівники відображають механізм адресації комп’ютера – доступ до комірок пам’яті На сьогодні мінімальною одиницею комірки пам’яті є байт Байт відповідає char

Посилання (reference) являє собою видозмінену форму вказівника, яка використовується в якості псевдоніму (іншого імені) Посилання (reference) являє собою видозмінену форму вказівника, яка використовується в якості псевдоніму (іншого імені) змінної Посилання не потребують додаткової пам’яті Для визначення посилання використовують символ & (амперсант), який ставитися перед змінноюпосиланням. Змінні типу посилання можуть використовуватися в наступних цілях: n n n замість передачі у функцію об'єкта за значенням; для визначення конструктора копії; для перевантаження унарних операцій;

Масиви Масив – похідний тип даних; Масив - спеціальна форма вказівника, яка зв’язана з Масиви Масив – похідний тип даних; Масив - спеціальна форма вказівника, яка зв’язана з неперервним фрагментом пам’яті для зберігання індексованих послідовностей значень; int* c; char** ppr; int* ap[15]; //масив з 15 вказівників на int* f(char*); int (*fp)(char*); //вказівник на функцію

Масиви Для будь-якого типу Т T[size] – масив із size елементів float a[31]; double Масиви Для будь-якого типу Т T[size] – масив із size елементів float a[31]; double b[3]; Розмір масиву size повенен бути константою!

Багатовимірні масиви Масив, елементами якого є масиви int d 2[10][20]; //матриця 10 на 20 Багатовимірні масиви Масив, елементами якого є масиви int d 2[10][20]; //матриця 10 на 20 float d 3[10][10]; //тривимірний масив

Ініціалізатор масиву Список значень int v 1[] = {1, 2, 3, 4}; char v Ініціалізатор масиву Список значень int v 1[] = {1, 2, 3, 4}; char v 2[] = {‘a’, ‘b’, 0}; Якщо масив оголошено без вказання розміру, але ініціалізовано списком, то розмір обчислюється автоматично шляхом підрахунку елементів списку! Якщо розмір вкзаується явно, то кількість елементів не повинна перевищувати заданого розміру! char v 3[2] = {‘a’, ‘b’, 0}; // помилка!

Ініціалізатор масиву (прод. ) Якщо в списку недостатньо елементів, інші елементи ініціалізуються нулями! int Ініціалізатор масиву (прод. ) Якщо в списку недостатньо елементів, інші елементи ініціалізуються нулями! 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* p 1 = v; int* p 2 = &v[0]; int* p 3 = &v[4]; p 1 p 2 v 1 p 3 2 3 4

Двовимірний масив Масив виду A[N][M] int a[4][5]; int* p; *p = a; a[i][j] = Двовимірний масив Масив виду A[N][M] int a[4][5]; int* p; *p = a; a[i][j] = 4; *(p+i*M+j) = 4; j i N * M

Двовимірний масив (прод. ) Розміщення в пам’яті p p+1 p+2 p+3 p+4 p+5 a[0][0] Двовимірний масив (прод. ) Розміщення в пам’яті p p+1 p+2 p+3 p+4 p+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; Двовимірний масив int** data; data = new int*[N]; // створення рядків for (int j=0; j

Структура Складений тип, який поєднує різні компоненти в єдину іменованну змінну Масив – набір Структура Складений тип, який поєднує різні компоненти в єдину іменованну змінну Масив – набір елементів одного типу Структура - набір елементів різних типів struct address { char* name; long int number; char* street; char* city; long zip; };

Структура (прод. ) Елементи структури наз. членами (members) Вони мають індивідуальні імена! Структури використовуються Структура (прод. ) Елементи структури наз. членами (members) Вони мають індивідуальні імена! Структури використовуються для створення агрегатів, які підходять для опису складних даних

Оголошення змінної типу структури address jb; jb. name = “John Doe”; jb. number = Оголошення змінної типу структури address jb; jb. name = “John Doe”; jb. number = 61; Для ініціалізації структури можна використати ініціалізатор масиву: address jb = {“James Bond”, 61, “Arapahot Str. ”, “Boulder, CO”, 02092};

Доступ до елементів структури Два способи: n n Крапка: змінна_структури. ім’я_елемента Вказівник w (*вказівник_структури). Доступ до елементів структури Два способи: n n Крапка: змінна_структури. ім’я_елемента Вказівник w (*вказівник_структури). ім’я_елемента w вказівник_структури->ім’я_елемента address my; my. number = 116; address* neighbor; neighbor->number = 120; // або (*neighbor). number = 120;

Операції над структурами Доступ до елементів n n крапка (. ), або вказівники (->) Операції над структурами Доступ до елементів n n крапка (. ), або вказівники (->) Присвоювання (=) Операція порівняння не визначенa! (==, !=, тощо) Структури можна передавати як аргументи функцій address set_cur(address next){ address prev = current; current = next; return prev; }

Приклад: аргумент функції Приклад: аргумент функції