AC 2-мерный массив - это не что иное, как массив массивов.Такой двумерный массив не может быть «рваным», т. Е. Каждая строка должна иметь одинаковое количество элементов.Для вашего конкретного случая вы можете объявить его следующим образом:
int big[4][4] =
{ { 1, 2, 3, 4 },
{ 10, 12, 13, 14 },
{ 8, 9, 15, 16 },
{ 17, 18, 19, 20 } };
Вы можете опустить первое измерение: int big[][4] = ...
, и длина будет определена инициализатором, но вы не можете пропустить второе.
Одним из преимуществ этого подхода является то, что это один объект, и вы можете использовать sizeof
для определения количества элементов:
sizeof big == 16 * sizeof (int)
sizeof big[0] == sizeof *big == 4 * sizeof (int)
sizeof big[0][0] == sizeof (int)
Но недостатком является то, что размерыисправлено.
Другой подход заключается в использовании массива указателей, где каждый указатель указывает на первый элемент массива:
int row0[] = { 1, 2, 3, 4 };
int row1[] = { 10, 12, 13, 14 };
int row2[] = { 8, 9, 15, 16 };
int row3[] = { 17, 18, 19, 20 };
int *big[4] = { row0, row1, row2, row3 };
(В инициализаторе row0
- это массивимя, но он распадается на указатель на первый элемент, также для row1
, row2
и row3
).Это более гибко, но вы должны отслеживать количество элементов в каждой строке;sizeof big[0]
даст вам размер указателя, а не самой строки.
Еще один подход - сделать big
указатель на указатель:
int row0[] = { 1, 2, 3, 4 };
int row1[] = { 10, 12, 13, 14 };
int row2[] = { 8, 9, 15, 16 };
int row3[] = { 17, 18, 19, 20 };
int *rows[] = { row0, row1, row2, row3 };
int **big = rows;
Этоеще более гибким (и на практике вы, вероятно, выделите все с помощью malloc()
.
. Четвертый подход, возможно, не очень полезный, состоит в том, чтобы сделать big
массивом указателей на массивы; я выиграл 'не вдаваться в подробности этого.
Из-за правил затухания массива в указатель, хотя big
имеет 4 разных типа в 4 разных случаях, вы можете использовать один и тот же синтаксис для ссылки наint
элементов: big[x][y]
.
Рекомендуемое прочтение, как всегда: раздел 6 comp.lang.c FAQ .