Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Мова програмування С.docx
Скачиваний:
3
Добавлен:
01.05.2025
Размер:
490 Кб
Скачать
☆

5.8 Ініціалізація масиву покажчиків

Уявіть собі завдання по написанню функції month_name(n), яка би повертала покажчик на символьний ланцюжок, який містить назву n-нного місяця. Це являє собою ідеальне примінення внутрішнього статичного масиву. month_name включатиме приватний масив символьних ланцюжків, і повертатиме покажчик на відповідний, коли викликати її. Цей розділ демонструє, як ініціалізувати такий масив назв.

Синтаксис є подібним до попередніх ініціалізацій:

/* month_name: повертає назву n-нного місяця */

char *month_name(int n)

{

static char *name[] = {

"Illegal month",

"January", "February", "March",

"April", "May", "June",

"July", "August", "September",

"October", "November", "December"

};

return (n < 1 || n > 12) ? name[0] : name[n];

}

Оголошення name являється масивом символьних покажчиків, таким самим як lineptr у прикладі з сортуванням. Ініціалізатором служить список символьних ланцюжків; кожному з них призначено відповідне положення в масиві. Символи i-ного ланцюжка розміщено в певному місці і покажчик на них збережено в name[i]. Оскільки розмір масиву name не вказано, компілятор сам порахує ініціалізатори і заповнить розмір правильним числом.

5.9 Покажчики в порівнянні з багатовимірними масивами

Новачки C, часом, плутаються з відмінністю між двовимірним масивом і масивом покажчиків, такому як name, у вищенаведеному прикладі. Маючи два визначення

int a[10][20];

int *b[10];

a[3][4] і b[3][4], обидва, являються синтаксично-правильними посиланнями на певну одиницю. Але a, це справжній двовимірний масив: під нього відведено 200 положень розміруint, і використовується традиційне прямокутне обчислення індексів 20*row+col для того, щоб віднайти елемент a[row,col]. Проте, у випадку з b, таке визначення виділяє тільки 10 покажчиків, не ініціалізуючи їх; ініціалізацію потрібно здійснити явно, або статично, або ж за допомогою коду. Припускаючи, що кожний елемент b вказує на масив з двадцяти елементів, тоді буде відведено місце під 200 int, плюс десять комірок для покажчиків. Важливою перевагою масиву покажчиків є те, що рядки масиву можуть бути різноманітного розміру. Тобто, кожний елемент b не обов'язково повинен вказувати на вектор з двадцяти елементів; деякі можуть показувати на два елементи, інші — на п'ятдесят, а деякі — на жоден. Хоч ми й обійшлися в цій дискусії цілими числами, найчастіше використання масиву покажчиків полягає в збереженні символьних ланцюжків різноманітної довжини, як у функції month_name. Порівняйте оголошення і малюнок для масиву покажчиків

char *name[] = { "Illegal month", "Jan", "Feb", "Mar" };

name:

+-----+ +-----------------+

| *--|-----> | Illegal month\0 |

| | +-----------------+

| | +-------+

| *--|-----> | Jan\0 |

| | +-------+

| | +-------+

| *--|-----> | Feb\0 |

| | +-------+

| | +-------+

| *--|-----> | Mar\0 |

+-----+ +-------+

з аналогічними для двовимірного масиву:

char aname[][15] = { "Illegal month", "Jan", "Feb", "Mar" };

aname:

+----------------------------------------------------------------+

| Illegal month\0 Jan\0 Feb\0 Mar\0 |

+----------------------------------------------------------------+

0 15 30 45

Вправа 5-9. Перепишіть наново функції day_of_year і month_day із покажчиками замість індексів.