C Програмування

2D масив

2D масив
Двовимірний (2D) масив - це масив одновимірних (1D) масивів. Розміри 1D-масиву рівні. Двовимірний масив також називають матрицею з рядками та стовпцями.

Давайте подивимось на наступний приклад:

Ці 3D-масиви можна представити у вигляді 2D-масиву наступним чином:

Побачимо ще один приклад:

Ці 3D-масиви не можуть бути представлені як 2D-масиви, оскільки розміри масивів різні.

Декларація 2D-масиву

тип даних ім'я масиву[РЯДОК] [COL]

int a [2] [3];

Використовуючи наведений вище код С, ми можемо оголосити ціле число масив, a розміру 2 * 3 (2 рядки та 3 колонки).

char b [3] [2];

Використовуючи наведений вище код С, ми можемо оголосити a характер масив, b розміру 2 * 3 (3 рядки та 2 колонки).

Ініціалізація 2D-масиву

Ми можемо ініціалізувати під час оголошення наступними способами:

  1. int a [3] [2] = 1,2,3,4,5,6;
  2. int a [] [2] = 1,2,3,4,5,6;
  3. int a [3] [2] = 1, 2, 3, 4, 5, 6;
  4. int a [] [2] = 1, 2, 3, 4, 5, 6;

Зверніть увагу, що в 2 та 4 ми не згадували 1вул нижній індекс. Компілятор C автоматично обчислює кількість рядків з кількості елементів. Але 2й індекс повинен бути вказаний. Наступні ініціалізації недійсні:

  1. int a [3] [] = 1,2,3,4,5,6;
  2. 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 [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 у десятковій.

Висновок

Отже, у цій статті ми дізналися про

  1. Декларація 2D-масиву
  2. Ініціалізація 2D-масиву
  3. Картування пам'яті 2D-масиву
  4. Арифметика покажчика 2D-масиву

Тепер ми можемо використовувати 2D-масив у нашій програмі на C. без будь-яких сумнівів,

Список літератури

Похвала для деяких ідей у ​​цій роботі була натхненна курсом, Покажчики та 2-D масиви, Палашем Дей Департаментом комп'ютерних наук та Engg. Індійський технологічний інститут Харагпур

Як встановити League of Legends на Ubuntu 14.04
Якщо ви шанувальник League of Legends, то це можливість для вас тестувати League of Legends. Зверніть увагу, що LOL підтримується на PlayOnLinux, якщо...
Встановіть останню стратегічну гру OpenRA на Ubuntu Linux
OpenRA - це ігровий движок Libre / Free Real Time Strategy, який відтворює ранні ігри Вествуда, такі як класичний Command & Conquer: Red Alert. Пошире...
Встановіть найновіший емулятор Dolphin для Gamecube & Wii на Linux
Емулятор Dolphin дозволяє грати у вибрані вами ігри Gamecube та Wii на персональних комп’ютерах Linux (ПК). Будучи вільно доступним і відкритим ігров...