Давайте подивимось на наступний приклад:
Ці 3D-масиви можна представити у вигляді 2D-масиву наступним чином:
Побачимо ще один приклад:
Ці 3D-масиви не можуть бути представлені як 2D-масиви, оскільки розміри масивів різні.
Декларація 2D-масиву
тип даних ім'я масиву[РЯДОК] [COL]
- Тип даних - тип даних елементів масиву.
- Array-name - це ім'я масиву.
- Два індекси представляють кількість рядків і стовпців масиву. Загальна кількість елементів масиву буде ROW * COL.
int a [2] [3];
Використовуючи наведений вище код С, ми можемо оголосити ціле число масив, a розміру 2 * 3 (2 рядки та 3 колонки).
char b [3] [2];
Використовуючи наведений вище код С, ми можемо оголосити a характер масив, b розміру 2 * 3 (3 рядки та 2 колонки).
Ініціалізація 2D-масиву
Ми можемо ініціалізувати під час оголошення наступними способами:
- int a [3] [2] = 1,2,3,4,5,6;
- int a [] [2] = 1,2,3,4,5,6;
- int a [3] [2] = 1, 2, 3, 4, 5, 6;
- int a [] [2] = 1, 2, 3, 4, 5, 6;
Зверніть увагу, що в 2 та 4 ми не згадували 1вул нижній індекс. Компілятор C автоматично обчислює кількість рядків з кількості елементів. Але 2й індекс повинен бути вказаний. Наступні ініціалізації недійсні:
- int a [3] [] = 1,2,3,4,5,6;
- int a [] [] = 1,2,3,4,5,6;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | // Приклад1.c #включати #define ROW 3 #define COL 2 int main () int i, j; int a [РЯД] [COL] = 1,2, 3,4, 5,6 ; printf ("Елементи масиву a такі: \ n"); для (i = 0; i printf ("Рядок% d:", i); для (j = 0; j printf ("% d", a [i] [j]); printf ("\ n"); printf ("\ n \ n Елементи масиву a такі: \ n"); для (i = 0; i printf ("Стовпець% d:", i); для (j = 0; j printf ("% d", a [j] [i]); printf ("\ n"); повернути 0; |
У прикладі1.c, ми оголосили цілочисельний масив розміром 3 * 2 та ініціалізували. Для доступу до елементів масиву ми використовуємо два for for.
Для доступу по рядках зовнішній цикл призначений для рядків, а внутрішній цикл - для стовпців.
Для доступу по стовпцях зовнішній цикл призначений для стовпців, а внутрішній цикл - для рядків.
Зверніть увагу, що коли ми оголошуємо 2D-масив, ми використовуємо [2] [3], що означає 2 рядки та 3 стовпці. Індексація масиву починається з 0. Щоб отримати доступ до 2й ряд і 3рд стовпець, ми повинні використовувати позначення a [1] [2].
Зіставлення пам'яті 2D-масиву
Логічний вигляд масиву a [3] [2] може бути таким:
Пам'ять комп'ютера - це одновимірна послідовність байтів. Мовою C, 2D-масив зберігається в пам'яті в ряд-мажорний порядок. Деякі інші мови програмування (наприклад,.g., FORTRAN), він зберігається в колонка-мажорний порядок в пам'яті.
Арифметика покажчика 2D-масиву
Щоб зрозуміти арифметику покажчика 2D-масиву, спочатку подивіться на 1D-масив.
Розглянемо одновимірний масив:
В 1D масиві, a є константою, а її значенням є адреса 0го розташування масиву a [5]. Значення a + 1 - це адреса 1вул розташування масиву a [5]. a + i - адреса iго розташування масиву.
Якщо ми збільшуємо a на 1 він збільшується на розмір типу даних.
a [1] еквівалентно * (a + 1)
a [2] еквівалентно * (a + 2)
a [i] еквівалентно * (a + i)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | // Приклад2.c #включати #define ROW 3 #define COL 2 int main () int a [5] = 10,20,30,40,50; printf ("sizeof (int):% ld \ n \ n", sizeof (int)); printf ("a:% p \ n", a); printf ("a + 1:% p \ n", a + 1); printf ("a + 2:% p \ n \ n", a + 2); printf ("a [1]:% d, * (a + 1):% d \ n", a [1], * (a + 1)); printf ("a [2]:% d, * (a + 2):% d \ n", a [1], * (a + 1)); printf ("a [3]:% d, * (a + 3):% d \ n", a [1], * (a + 1)); повернути 0; |
У прикладі2.c, адреса пам'яті відображається шістнадцятковою цифрою. Різниця між a та a + 1 дорівнює 4, що є розміром цілого числа в байтах.
Тепер розглянемо 2D-масив:
b є покажчиком типу: int [] [4] або int (*) [4]
int [] [4] це рядок з 4 цілих чисел. Якщо збільшити b на 1, він збільшується на розмір рядка.
b - адреса 0го рядок.
b + 1 - адреса 1вул рядок.
b + i - адреса iго рядок.
Розмір рядка: (Кількість стовпців * sizeof (тип даних)) байт
Розмір рядка цілочисельного масиву b [3] [4] становить: 4 * sizeof (int) = 4 * 4 = 16 байт
Рядок 2D-масиву можна розглядати як 1D-масив. b - адреса 0го рядок. Отже, ми отримуємо наступне
- * b + 1 - адреса 1вул елемент 0го
- * b + j - адреса jго елемент 0го
- * (b + i) - адреса 0го елемент iго
- * (b + i) + j - адреса jго елемент iго
- b [0] [0] еквівалентно ** b
- b [0] [1] еквівалентно * (* b + 1)
- b [1] [0] еквівалентно * (* (b + 1))
- b [1] [1] еквівалентно * (* (b + 1) +1)
- b [i] [j] еквівалентно * (* (b + i) + j)
Адреса b [i] [j]: b + sizeof (тип даних) * (Номер стовпця * i + j)
Розглянемо 2D-масив: int b [3] [4]
Адреса b [2] [1]: : b + розмір (int) * (4 * 2 + 1)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | // Приклад3.c #включати #define ROW 3 #define COL 4 int main () int i, j; int b [РЯД] [COL] = 10,20,30,40, 50,60,70,80, 90,100,110,120 ; printf ("sizeof (int):% ld \ n", sizeof (int)); printf ("Розмір рядка:% ld \ n", COL * sizeof (int)); printf ("b:% p \ n", b); printf ("b + 1:% p \ n", b + 1); printf ("b + 2:% p \ n", b + 2); printf ("* b:% p \ n", * b); printf ("* b + 1:% p \ n", * b + 1); printf ("* b + 2:% p \ n", * b + 2); printf ("b [0] [0]:% d ** b:% d \ n", b [0] [0], ** b); printf ("b [0] [1]:% d * (* b + 1):% d \ n", b [0] [1], * (* b + 1)); printf ("b [0] [2]:% d * (* b + 2):% d \ n", b [0] [2], * (* b + 2)); printf ("b [1] [0]:% d * (* (b + 1)):% d \ n", b [1] [0], * (* (b + 1))); printf ("b [1] [1]:% d * (* (b + 1) +1):% d \ n", b [1] [1], * (* (b + 1) +1) ); повернути 0; |
У прикладі 3.c, ми побачили, що розмір рядка дорівнює 16 в десяткових записах. Різниця між b + 1 і b дорівнює 10 у шістнадцятковій. 10 у шістнадцятковій системі еквівалентно 16 у десятковій.
Висновок
Отже, у цій статті ми дізналися про
- Декларація 2D-масиву
- Ініціалізація 2D-масиву
- Картування пам'яті 2D-масиву
- Арифметика покажчика 2D-масиву
Тепер ми можемо використовувати 2D-масив у нашій програмі на C. без будь-яких сумнівів,
Список літератури
Похвала для деяких ідей у цій роботі була натхненна курсом, Покажчики та 2-D масиви, Палашем Дей Департаментом комп'ютерних наук та Engg. Індійський технологічний інститут Харагпур