- •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()
9.2 Оголошення та звертання в одновимірних масивах
Форма оголошення одновимірного масиву з явною вказівкою кількості елементів масиву:
тип ім'я_масива [кількість-елементів-масива];
Звертання до елементів одновимірного масиву в загальному випадку можна представити індексуванням, тобто у вигляді
ім'я-масива [вираз]; де ім'я-масиву - вказівник-константа;
вираз - індекс, число цілого типу; він визначає зсув - збільшення адреси заданого елемента масиву щодо адреси нульового елемента масиву.
Елементи одновимірного масиву розташовуються в ОП підряд: нульовий, перший і т д. Приклад оголошення масиву:
int а[10];
int *p = а; /* - р одержує значення а */
При цьому компілятор виділяє масив в стеку ОП розміром (sizeof(Type) * розмір-масиеу) байтів.
У вищенаведеному прикладі це 2 * 10 = 20 байтів. Причому а -вказівник-константа, адреса початку масиву, тобто його нульового елемента, р - змінна; змінній р можна присвоїти значення одним із способів:
р = а;
р = &а[0];
р = &a[i];
де &а[і] == (а + і) - адреса і-елемента масиву.
Відповідно до правил перетворення типів значення адреси i-елемента масиву на машинному рівні формується таким чином:
&а^]= а + i * sizeof(int) ;
Справедливі також наступні співвідношення:
&a == a+0 == &a[0] - адреса а[0] - нульового елемента масиву;
а+2 == &а [2] - адреса а[2] - другого елементи масиву;
а+i == &a[i] - адреса a[i] - i-го елемента масиву;
*а==* (а+0) ==* (&а[0]) ==a[0] - значення 0-ого елемента масиву;
*( а + 2) == а[2] - значення а[2] - другого елементи масиву;
*(а + i) == а [i] - значення a[i] - i-го елемента масиву;
* а + 2 == а[0] + 2 - сума значень а[0] і 2.
Якщо р - покажчик на елементи такого ж типу, які і елементи масиву a та p=a, то а та р взаємозамінні; при цьому:
p == &a[0] == a + 0;
p+2 == &a[2] == a + 2;
*(p + 2) == (&a[2]) == a[2] == p[2];
*(p + i) == (&a[i]) == a[i] == p[i];
Для a та p еквівалентні всі звертання до елементів a у вигляді:
a[i], *(a+i), *(i+a), i[a], та p[i],
*(p+i), *(i+p), i[p]
9.3 Оголошення та звертання до багатовимірних масивів
У даному розділі розглянемо оголошення і зв'язок вказівників і елементів багатомірних масивів - що мають 2 та більше вимірів.
Багатомірний масив у мові Сі розглядається як сукупність масивів меншої розмірності. Наприклад, двовимірний масив - це сукупність одновимірних масивів (його рядків), тривимірний масив - це сукупність матриць, матриці - сукупності рядків, а рядок - сукупність елементів одновимірного масиву.
Елементи масивів розташовуються в ОП таким чином, що швидше змінюються самі праві індекси, тобто елементи одновимірного масиву розташовуються підряд, двовимірного - по рядках, тривимірного - по матрицях, а матриці - по рядках.
Для звертання до елементів багатомірного масиву можна використовувати нуль і більш індексів (індексних виразів):
ім'я-масиву [вираз1][вираз2] ...
Наприклад, для звертання:
• до одновимірного масиву можна використовувати одно-індексний вираз (індекс);
• до двовимірного - 1 або 2 індексний вираз;
• до тривимірного - 1, 2 або 3 індексний вираз і т.д.
При звертанні до багатомірних масивів одержання значення елемента масиву можливо тільки після визначення адреси елемента масиву, тобто при повній кількості індексів. При цьому обчислюються індексні вираз зліва на право, і доступу до значення виконується після обчислення останнього індексного виразу.
Приклад оголошення двовимірного масиву значень типу int:
int а^]^] ;
Цей масив складається з m одновимірних масивів (рядків), у кожному з яких утримується n елементів (стовпців). При роботі з цим двовимірним масивом можна використовувати одно або 2 індексний вираз. Наприклад:
а[і] [j]- містить 2 індекси; використовується для звертання до елемента і-рядка, j-стовпця масиву; обчислюються індексні вирази, визначається адреса елемента масиву і вилучається його значення;
a[i] - містить 1 індекс; визначає адресу одновимірного масиву: адреса початку і-рядка масиву;
а - не містить індексу і визначає адресу масиву, його нульового елемента.
Таким чином, звертання до двовимірних масивів за допомогою імені і тільки одного індексу визначає покажчик на початок відповідного рядка масиву (адреса його нульового елемента). Наприклад:
а[0] == &a[0][0] == a+0*n*sizeof(int);
а[1] == &а[1][0] == a+1*n*sizeof(int);
a[i] == &a[i][0] == a+i*n*sizeof(int);
Приклад оголошення тривимірного масиву:
int a[k][m][n] ;
- k- кількість матриць з m рядками і n стовпцями;
- m - кількість рядків (одновимірних масивів) у матриці;
- n - кількість стовпців (елементів у рядку) матриці.
Цей масив складається з k матриць, кожна з яких складається з m одновимірних масивів (рядків) по n елементів (стовпців). При звертанні до цього масиву можна використовувати імена:
a[l][i][j] - містить 3 індекси; використовується для звертання до елемента l-матриці, і-рядка. j-стовпця масиву; обчислюються індексні вирази, визначається адреса елемента масиву і вилучається його значення;
a[k] [i] - визначає одновимірний масив - адреса початку і-рядка; k -матриці;
a[k] - визначає двовимірний масив - адреса початку k - матриці, тобто нульового елемента його нульового рядка;
а - адреса початку масиву, нульового елемента нульового рядка нульової матриці.
Наприклад:
int b[3][4][5];
int i, *ip, *ipp; i = b[0][0] [1];
де: ір, ірр - покажчики на значення типу int.
Після ip = b[2][0]; ip є покажчиком на елемент 0-рядка 0-го стовпця 2-й матриці масиву, тобто Ь[2][0][0].
Після ipp = b[2]; ipp адресує 0-й рядок 2-ї матриці масиву, тобто містить адреса b[2] [0] [0].
де:
ipp b[2] [0]; = b[2];
Звертання до елементів багатомірного масиву більш детально розглянемо на прикладі двовимірного масиву. Наприклад:
