Ц Програмирање

2Д Арраи

2Д Арраи
Дводимензионални (2Д) низ је низ једнодимензионалних (1Д) низова. Величине 1Д низа су једнаке. 2Д низ се назива и матрица са редовима и колонама.

Погледајмо следећи пример:

Ови 3 1Д низови се могу представити као 2Д низови на следећи начин:

Погледајмо још један пример:

Ови 3 1Д низови не могу бити представљени као 2Д низови, јер су величине низова различите.

Декларација 2Д низа

тип података име-низа[РЕД] [ЦОЛ]

инт а [2] [3];

Користећи горњи Ц код, можемо прогласити цео број низ, а величине 2 * 3 (2 реда и 3 колоне).

цхар б [3] [2];

Користећи горњи Ц код, можемо прогласити а карактер низ, б величине 2 * 3 (3 реда и 2 колоне).

Иницијализација 2Д низа

Можемо иницијализовати током декларације на следеће начине:

  1. инт а [3] [2] = 1,2,3,4,5,6;
  2. инт а [] [2] = 1,2,3,4,5,6;
  3. инт а [3] [2] = 1, 2, 3, 4, 5, 6;
  4. инт а [] [2] = 1, 2, 3, 4, 5, 6;

Имајте на уму да у 2 и 4 нисмо поменули 1ст индекс. Компајлер Ц аутоматски израчунава број редова из броја елемената. Али 2нд мора бити наведен индекс. Следеће иницијализације су неважеће:

  1. инт а [3] [] = 1,2,3,4,5,6;
  2. инт а [] [] = 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.ц
#инцлуде
#дефине РОВ 3
#дефине ЦОЛ 2
инт маин ()

инт и, ј;
инт а [РЕД] [ЦОЛ] =
1,2,
3,4,
5,6
;
принтф ("Елементи низа а су: \ н");
за (и = 0; и
принтф ("Ред% д:", и);
за (ј = 0; ј
принтф ("% д", а [и] [ј]);

принтф ("\ н");

принтф ("\ н \ нЕлементи низа а су: \ н");
за (и = 0; и
принтф ("Колона% д:", и);
за (ј = 0; ј
принтф ("% д", а [ј] [и]);

принтф ("\ н");

ретурн 0;

У Примеру1.ц, прогласили смо целобројни низ величине 3 * 2 и иницијализовали се. За приступ елементима низа користимо два фор петље.

За приступ редовима, спољна петља је за редове, а унутрашња за колоне.

Да бисте приступили у колони, спољна петља је за колоне, а унутрашња за редове.

Имајте на уму да када декларишемо 2Д низ, користимо [2] [3], што значи 2 реда и 3 колоне. Индексирање низа почиње од 0. Да бисте приступили 2нд ред и 3рд колона, морамо користити ознаку а [1] [2].

Мапирање меморије 2Д низа

Логичан приказ низа а [3] [2] може бити следеће:

Меморија рачунара је 1Д секвенца бајтова. На језику Ц, 2Д низ чува у меморији у ред-дур ред. Неки други програмски језици (нпр.г., ФОРТРАН), складишти у колона-главни ред у сећању.

Аритметика показивача 2Д низа

Да бисте разумели аритметику показивача 2Д низа, прво погледајте 1Д низ.

Размотрите 1Д низ:

У 1Д низу, а је константа, а његова вредност је адреса 0тх локација низа а [5]. Вредност а + 1 је адреса 1ст локација низа а [5].  а + и је адреса итх локација низа.

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

а [1] је еквивалентно са * (а + 1)

а [2] је еквивалентно са * (а + 2)

а [и] је еквивалентно са * (а + и)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// Пример2.ц
#инцлуде
#дефине РОВ 3
#дефине ЦОЛ 2
инт маин ()

инт а [5] = 10,20,30,40,50;
принтф ("сизеоф (инт):% лд \ н \ н", сизеоф (инт));
принтф ("а:% п \ н", а);
принтф ("а + 1:% п \ н", а + 1);
принтф ("а + 2:% п \ н \ н", а + 2);
принтф ("а [1]:% д, * (а + 1):% д \ н", а [1], * (а + 1));
принтф ("а [2]:% д, * (а + 2):% д \ н", а [1], * (а + 1));
принтф ("а [3]:% д, * (а + 3):% д \ н", а [1], * (а + 1));
ретурн 0;

У Примеру2.ц, адреса меморије приказује се у хексадецималном облику. Разлика између а и а + 1 је 4, што је величина целог броја у бајтовима.

Сада размотрите 2Д низ:

б је показивач типа: инт [] [4] или инт (*) [4]

инт [] [4] је ред од 4 целобројне вредности. Ако б повећамо за 1, оно се увећава за величину реда.

б је адреса 0тх ред.

б + 1 је адреса 1ст ред.

б + и је адреса итх ред.

Величина реда је: (Број бајтова * величина колоне * (врста података))

Величина реда целобројног низа б [3] [4] је: 4 * величина (инт) = 4 * 4 = 16 бајтова

Ред 2Д низа може се посматрати као 1Д низ. б је адреса 0тх ред. Дакле, добили смо следеће

Адреса б [и] [ј]: б + величина (тип података) * (број колоне * и + ј)

Размотримо 2Д низ: инт б [3] [4]

Адреса б [2] [1] је : б + величина (инт) * (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.ц
#инцлуде
#дефине РОВ 3
#дефине ЦОЛ 4
инт маин ()

инт и, ј;
инт б [РЕД] [ЦОЛ] =
10,20,30,40,
50,60,70,80,
90,100,110,120
;
принтф ("сизеоф (инт):% лд \ н", сизеоф (инт));
принтф ("Величина реда:% лд \ н", ЦОЛ * сизеоф (инт));
принтф ("б:% п \ н", б);
принтф ("б + 1:% п \ н", б + 1);
принтф ("б + 2:% п \ н", б + 2);
принтф ("* б:% п \ н", * б);
принтф ("* б + 1:% п \ н", * б + 1);
принтф ("* б + 2:% п \ н", * б + 2);
принтф ("б [0] [0]:% д ** б:% д \ н", б [0] [0], ** б);
принтф ("б [0] [1]:% д * (* б + 1):% д \ н", б [0] [1], * (* б + 1));
принтф ("б [0] [2]:% д * (* б + 2):% д \ н", б [0] [2], * (* б + 2));
принтф ("б [1] [0]:% д * (* (б + 1)):% д \ н", б [1] [0], * (* (б + 1)));
принтф ("б [1] [1]:% д * (* (б + 1) +1):% д \ н", б [1] [1], * (* (б + 1) +1) );
ретурн 0;

У Примеру3.ц, видели смо да је величина реда 16 у децималном запису. Разлика између б + 1 и б је 10 у хексадецималном облику. 10 у хексадецималном је еквивалентно 16 у децималном.

Закључак

Дакле, у овом чланку смо научили о томе

  1. Декларација 2Д низа
  2. Иницијализација 2Д низа
  3. Мапирање меморије 2Д низа
  4. Аритметика показивача 2Д низа

Сада без икакве сумње можемо користити 2Д низ у нашем Ц програму,

Референце

Заслуге за неке идеје у овом раду инспирисане су курсом, Показивачи и 2-Д низови, Паласх Деи, Одељење за рачунарске науке и Енгг. Индијски технолошки институт Кхарагпур

Најбољи емулатори играће конзоле за Линук
Овај чланак ће навести популарни софтвер за емулацију играће конзоле доступан за Линук. Емулација је слој компатибилности софтвера који опонаша хардве...
Најбољи Линук Дистрос за игре у 2021
Линук оперативни систем далеко је превалио свој изворни, једноставни изглед заснован на серверима. Овај ОС се изузетно побољшао последњих година и сад...
Како снимити и стримовати своју играћу сесију на Линук-у
У прошлости се играње игара сматрало само хобијем, али с временом је играчка индустрија забележила огроман раст у погледу технологије и броја играча. ...