Нека да видим следния пример:
Тези 3 1D масиви могат да бъдат представени като 2D масив, както следва:
Нека да видим друг пример:
Тези 3 1D масиви не могат да бъдат представени като 2D масив, тъй като размерите на масивите са различни.
Декларация за 2D масив
тип данни име на масив[РЕД] [COL]
- Тип данни е типът данни на елементите на масива.
- Array-name е името на масива.
- Два индекса представляват броя на редовете и колоните на масива. Общият брой елементи на масива ще бъде ROW * COL.
int a [2] [3];
Използвайки горния C код, можем да декларираме цяло число масив, а на размер 2 * 3 (2 реда и 3 колони).
char b [3] [2];
Използвайки горния C код, можем да декларираме a характер масив, б на размер 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 автоматично изчислява броя на редовете от броя на елементите. Но 2nd индексът трябва да бъде посочен. Следните инициализации са невалидни:
- 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.° С #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 + 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 + 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 в десетична запетая.
Заключение
И така, в тази статия научихме за
- Декларация за 2D масив
- Инициализация на 2D масив
- Картографиране на паметта на 2D масив
- Аритметика на показалеца на 2D масив
Сега можем да използваме 2D масив в нашата програма C без никакво съмнение,
Препратки
Кредитът за някои идеи в тази работа е вдъхновен от курса, указатели и 2-D масиви, от Palash Dey Department of Computer Science & Engg. Индийски технологичен институт Харагпур