Статический двумерный массив выглядит как массив массивов - он просто расположен непрерывно в памяти. Массивы - это не то же самое, что указатели, но поскольку вы часто можете использовать их почти взаимозаменяемо, иногда это может сбить с толку. Тем не менее, компилятор правильно отслеживает, что делает все правильно. Вы должны быть осторожны со статическими 2D-массивами, как вы упомянули, поскольку, если вы попытаетесь передать один из них в функцию, принимающую параметр int **
, могут произойти плохие вещи. Вот быстрый пример:
int array1[3][2] = {{0, 1}, {2, 3}, {4, 5}};
В памяти выглядит так:
0 1 2 3 4 5
точно так же, как:
int array2[6] = { 0, 1, 2, 3, 4, 5 };
Но если вы попытаетесь передать array1
этой функции:
void function1(int **a);
вы получите предупреждение (и приложению не удастся правильно получить доступ к массиву):
warning: passing argument 1 of ‘function1’ from incompatible pointer type
Поскольку двумерный массив отличается от int **
. Автоматическое разложение массива на указатель идет, так сказать, только на один уровень. Вам нужно объявить функцию как:
void function2(int a[][2]);
или
void function2(int a[3][2]);
Чтобы сделать все счастливым.
Эта же концепция распространяется на n -мерных массивов. Однако использование такого рода забавных бизнесов в вашем приложении, как правило, только усложняет понимание. Так что будьте осторожны там.