
- •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()
6.8. Масиви вказівників (вказівники на вказівники)
Вказівники самі є змінними, тому можна використовувати масиви вказівників. Це дійсно так. Покажемо це на прикладі програми сортування за абеткою набору текстових рядків.
Якщо рядки зберігаються один за одним в довгому символьному масиві, то до кожного рядка можна звернутися за допомогою вказівника на його перший символ. Самі вказівники можна зберігати в масиві. Два рядки можна порівняти, передавши їх вказівники функції Strcmp. Якщо два рядки, розміщені в неправильному порядку, повинні бути переставлені, то фактично переставляються вказівники в масиві вказівників, а не самі тексти рядків. Цим виключаються відразу дві пов’язані проблеми: складне керування пам’яттю і значні витрати на перестановку рядків.
Процес сортування містить три кроки: читання всіх рядків уведення, їх сортування та виведення у правильній послідовності.
Розділимо програму на кілька функцій і виділимо провідну функцію, яка керує роботою всієї програми. Спочатку розглянемо структуру даних і їх введення або виведення. Функція, яка здійснює введення, повинна одержувати символи кожного рядка, запам’ятовувати їх і будувати масив вказівників рядків. Вона також має підраховувати кількість введених рядків, потрібну для сортування і виведення, за умови кінцевої кількості рядків. У разі надто великої їх кількості можна повертати деяку кількість рядків, відмінну від можливої, наприклад – функція виведення (див. ПП6.16 на СD) повинна друкувати рядки в тому порядку, в якому вони з’являються в масиві вказівників. Символ нового рядка наприкінці кожного рядка видаляється, тому він не буде впливати на порядок сортування рядків (ПП6.17 див. на СD).
Опис char *lineptr[lines]; повідомляє, що lineptr є масивом з lines елементів, кожен з яких – вказівник на змінні типу char. Це означає, що lineptr[i] – вказівник на символи, а *lineptr[i] зчитує символ. Сам lineptr є масивом, який передається функції WriteLines, і ним можна оперувати як вказівником. Тоді функція WriteLines матиме вигляд, як у ПП6.18. (див. на СD). Спочатку *lineptr вказує на перший рядок, кожне збільшення пересуває вказівник на наступний рядок, у той час, як nlines спадає до нуля.
Тепер можемо перейти до сортування, що реалізовано в ПП6.19. (див. на СD). Кожен окремий елемент масиву v (ім’я формального параметра, що відповідає lineptr) є вказівником на символи, тому і temp має бути вказівником на символи, щоб їх можна було копіювати один в один.
6.9. Ініціалізація масивів вказівників
Розглянемо функцію Month_name(n), яка повертає вказівник на символьний рядок, що містить ім’я n-го місяця. Це завдання демонструє застосування внутрішнього статичного масиву. Функція Month_name містить локальний масив символьних рядків і при зверненні до неї повертає вказівник потрібного рядка. Ініціалізація масиву імен виконується, як показано в ПП6.20. (див. на СD).
Опис масиву вказівників на символи name такий, як опис lineptr у прикладі із сортуванням. Ініціалізатором є просто список символьних рядків, де кожен рядок присвоюється відповідній позиції в масиві. Оскільки розмір масиву name не зазначений, компілятор сам підраховує кількість ініціалізаторів і відповідно встановлює правильне число.