Новачки 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 із покажчиками замість індексів.