Двовимірні масиви, програмування на c і ​​c

З дозволяє створювати багатовимірні масиви. Найпростішим видом багатовимірного масиву є двовимірний масив. Двовимірний масив - це масив одновимірних масивів. Двовимірний масив оголошується наступним чином:

тип імя_массіва [розмір другого виміру] [розмір першого виміру];

Для доступу до елементу з індексами 3, 5 масиву d слід використовувати

У наступному прикладі в двовимірний масив заносяться числа від 1 до 12, після чого масив виводиться на екран.

#include
int main (void)
int t, i, num [3] [4];
/ * Завантаження чисел * /
for (t = 0; t<3; ++t)
for (i = 0; i<4; ++i)
num [t] [i] = (t * 4) + i + 1;

В даному прикладі num [0] [0] має значення 1, num [0] [1] має значення 2, num [0] [2] - 3 і так далі. num [2] [3] має значення 12.

Двовимірні масиви зберігаються у вигляді матриці, де перший індекс відповідає за рядок, а другий -за стовпець. Це означає, що правий індекс змінюється швидше лівого, якщо рухатися по масиву в порядку розташування елементів в пам'яті. На рис. показано графічне представлення двовимірного масиву в пам'яті. Лівий індекс можна розглядати як покажчик на рядок.

Число байт в пам'яті, необхідних для розміщення двовимірного масиву, обчислюється таким чином:

число байт = розмір другого виміру * розмір першого виміру * sizeof (базовий тип)

Припускаючи наявність в системі 2-байтних цілих, цілочисельний масив з размерностями 10 на 5 займатиме 10 * 5 * 2, тобто 100 байт.

Коли двовимірний масив використовується як аргумент функції, передається покажчик на перший елемент. Функція, яка отримує двовимірний масив, повинна, як мінімум, визначати розмір першого виміру, оскільки компілятору необхідно знати довжину кожного рядка для коректної індексації масиву. Наприклад, функція, яка отримує двовимірний цілочисельний масив з размерностями 5, 10, буде оголошуватися в такий спосіб:

Можна визначити розмір другого виміру, але це не обов'язково. Компілятору потрібно знати розмір першого виміру для правильного виконання операторів типу

в функції. Якщо довжина рядка не відома, неможливо дізнатися, де починається наступний рядок.

Коротка програма, наведена нижче, використовує двовимірний масив для зберігання оцінок кожного студента в класах вчителі. Програма передбачає, що вчитель має три класи і в кожному класі може бути максимум 30 студентів. Звернемо увагу, як здійснюється доступ до grade з кожної функції:

#include
#include
#include
#include
#define CLASSES 3
#define GRADES 30
int grade [CLASSES] [GRADES];
void disp_grades (int g [] [GRADES]), enter_grades (void);
int get_grade (int num);
int main (void) / * програма для зберігання оцінок * /
char ch;
for (;;) do printf ( "(E) nter grades \ n");
printf ( "(R) eport grades \ n");
printf ( "(Q) uit \ n");
ch = toupper (getche ());
>
while (ch! = 'E' ch! = 'R' ch! = 'Q');
switch (ch)
case 'E':
enter_grades ();
break;
case 'R':
disp_grades (grade);
break;
case 'Q':
return 0;
>
>
>

/ * Введення кожної оцінки студентів * /
void enter_grades (void)
int t, i;
for (t = 0; t for (i = 0; i grade [t] [i] = get_grade (i);
>
>

/ * Реальний введення оцінки * /
int get_grade (int num) char s [80];
printf ( "enter grade for student #.: \ n", num + 1);
gets (s);
return (atoi (s));
>

/ * Висновок оцінок класу * /
void disp_grades (int g [] [GRADES])
int t, i;
for (t = 0; t printf ( "Class #.: \ n", t + 1);
for (i = 0; i printf ( "grade for student #. is. \ n", i + 1, g [t] [i]);
>
>

Малюнок. Розміщення двовимірного масиву в пам'яті

Схожі статті