Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Вказівники та посилання.docx
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
857.42 Кб
Скачать

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 не зазначений, компілятор сам підраховує кількість ініціалізаторів і відповідно встановлює правильне число.