Погледајмо следећи пример:
Ови 3 1Д низови се могу представити као 2Д низови на следећи начин:
Погледајмо још један пример:
Ови 3 1Д низови не могу бити представљени као 2Д низови, јер су величине низова различите.
Декларација 2Д низа
тип података име-низа[РЕД] [ЦОЛ]
- Тип података је тип података елемената низа.
- Арраи-наме је име низа.
- Два индекса представљају број редова и колона низа. Укупан број елемената низа биће РЕД * ЦОЛ.
инт а [2] [3];
Користећи горњи Ц код, можемо прогласити цео број низ, а величине 2 * 3 (2 реда и 3 колоне).
цхар б [3] [2];
Користећи горњи Ц код, можемо прогласити а карактер низ, б величине 2 * 3 (3 реда и 2 колоне).
Иницијализација 2Д низа
Можемо иницијализовати током декларације на следеће начине:
- инт а [3] [2] = 1,2,3,4,5,6;
- инт а [] [2] = 1,2,3,4,5,6;
- инт а [3] [2] = 1, 2, 3, 4, 5, 6;
- инт а [] [2] = 1, 2, 3, 4, 5, 6;
Имајте на уму да у 2 и 4 нисмо поменули 1ст индекс. Компајлер Ц аутоматски израчунава број редова из броја елемената. Али 2нд мора бити наведен индекс. Следеће иницијализације су неважеће:
- инт а [3] [] = 1,2,3,4,5,6;
- инт а [] [] = 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тх ред. Дакле, добили смо следеће
- * б + 1 је адреса 1ст елемент 0тх
- * б + ј је адреса јтх елемент 0тх
- * (б + и) је адреса 0тх елемент итх
- * (б + и) + ј је адреса јтх елемент итх
- б [0] [0] је еквивалентно ** б
- б [0] [1] је еквивалентно * (* б + 1)
- б [1] [0] је еквивалентно * (* (б + 1))
- б [1] [1] је еквивалентно * (* (б + 1) +1)
- б [и] [ј] је еквивалентно * (* (б + и) + ј)
Адреса б [и] [ј]: б + величина (тип података) * (број колоне * и + ј)
Размотримо 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 у децималном.
Закључак
Дакле, у овом чланку смо научили о томе
- Декларација 2Д низа
- Иницијализација 2Д низа
- Мапирање меморије 2Д низа
- Аритметика показивача 2Д низа
Сада без икакве сумње можемо користити 2Д низ у нашем Ц програму,
Референце
Заслуге за неке идеје у овом раду инспирисане су курсом, Показивачи и 2-Д низови, Паласх Деи, Одељење за рачунарске науке и Енгг. Индијски технолошки институт Кхарагпур