C Програмиране

2D масив

2D масив
Двуизмерен (2D) масив е масив от едномерни (1D) масиви. Размерите на 1D масива са равни. 2D масивът се нарича още матрица с редове и колони.

Нека да видим следния пример:

Тези 3 1D масиви могат да бъдат представени като 2D масив, както следва:

Нека да видим друг пример:

Тези 3 1D масиви не могат да бъдат представени като 2D масив, тъй като размерите на масивите са различни.

Декларация за 2D масив

тип данни име на масив[РЕД] [COL]

int a [2] [3];

Използвайки горния C код, можем да декларираме цяло число масив, а на размер 2 * 3 (2 реда и 3 колони).

char b [3] [2];

Използвайки горния C код, можем да декларираме a характер масив, б на размер 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 автоматично изчислява броя на редовете от броя на елементите. Но 2nd индексът трябва да бъде посочен. Следните инициализации са невалидни:

  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.° С
#include
#define ROW 3
#define COL 2
int main ()

int i, j;
int a [ROW] [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 и инициализиран. За достъп до елементи на масив използваме две за цикъл.

За достъп до ред, външният цикъл е за редове, а вътрешният цикъл е за колони.

За достъп до колони външният цикъл е за колони, а вътрешният цикъл е за редове.

Имайте предвид, че когато декларираме 2D масив, използваме [2] [3], което означава 2 реда и 3 колони. Индексирането на масива започва от 0. За достъп до 2nd ред и 3rd колона, трябва да използваме обозначението a [1] [2].

Картографиране на паметта на 2D масив

Логическият изглед на масив a [3] [2] може да бъде както следва:

Компютърната памет е 1D последователност от байтове. На език C, 2D масив се съхранява в паметта в ред-основен ред. Някои други езици за програмиране (напр.ж., FORTRAN), той съхранява в колона-основен ред в паметта.

Аритметика на показалеца на 2D масив

За да разберете аритметиката на показалеца на 2D масива, първо разгледайте 1D масива.

Помислете за 1D масив:

В 1D масив, а е константа и нейната стойност е адресът на 0ти местоположение на масива a [5]. Стойност на a + 1 е адресът на 1ул местоположение на масива a [5].  a + i е адресът на iти местоположение на масива.

Ако увеличим а с 1, той се увеличава с размера на типа данни.

а [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.° С
#include
#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 масив:

б е указател от тип: int [] [4] или int (*) [4]

int [] [4] е ред от 4 цели числа. Ако увеличим b с 1, той се увеличава с размера на реда.

б е адресът на 0ти ред.

b + 1 е адресът на 1ул ред.

b + i е адресът на iти ред.

Размерът на реда е: (Брой колони * sizeof (тип данни)) байта

Размерът на ред на цяло число масив b [3] [4] е: 4 * sizeof (int) = 4 * 4 = 16 байта

Ред от 2D масив може да се разглежда като 1D масив. б е адресът на 0ти ред. И така, получаваме следното

Адрес на b [i] [j]: b + sizeof (тип данни) * (Номер на колона * i + j)

Помислете за 2D масив: int b [3] [4]

Адресът на b [2] [1] е : b + sizeof (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.° С
#include
#define ROW 3
#define COL 4
int main ()

int i, j;
int b [ROW] [COL] =
10,20,30,40,
50,60,70,80,
90 100 110 110
;
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 масиви, от Palash Dey Department of Computer Science & Engg. Индийски технологичен институт Харагпур

Как да използвам GameConqueror Cheat Engine в Linux
Статията обхваща ръководство за използването на GameConqueror cheat engine в Linux. Много потребители, които играят игри под Windows, често използват ...
Най-добрите емулатори на игрови конзоли за Linux
Тази статия ще изброи популярния софтуер за емулация на игрова конзола, наличен за Linux. Емулацията е слой за софтуерна съвместимост, който емулира х...
Най-добрите дистрибуции на Linux за игри през 2021 г
Операционната система Linux е изминала дълъг път от първоначалния си, прост, базиран на сървъра външен вид. Тази операционна система се подобри неимов...