Взаимосвязь между массивами и указателями является одним из наиболее запутанных аспектов C. Позвольте мне объяснить в качестве примера. Следующий код заполняет и отображает простой одномерный массив:
void showArray(int *ptr, int length)
{
for (int i = 0; i < length; i++)
printf("%d ", ptr[i]);
printf("\n");
}
int main(void)
{
int array[10];
for (int i = 0; i < 10; i++)
array[i] = i;
showArray(array, 10);
}
Вы можете видеть, что, когда массив передается в функцию, имя массива воспринимается как указатель на первый элемент массива. В этом примере первым элементом является int
, поэтому указатель int *
.
Теперь рассмотрим этот код, который заполняет и выводит двумерный массив:
void showArray(int (*ptr)[10], int rows, int cols)
{
for (int r = 0; r < rows; r++)
{
for (int c = 0; c < cols; c++)
printf("%2d ", ptr[r][c]);
printf("\n");
}
}
int main(void)
{
int array[5][10];
for (int row = 0; row < 5; row++)
for (int col = 0; col < 10; col++)
array[row][col] = row * 10 + col;
showArray(array, 5, 10);
}
Имя массива по-прежнему является указателем на первый элемент массива.Но в этом примере первый элемент массива сам по себе является массивом, а именно массивом из 10 int
. Таким образом, указателем в функции является указатель на массив из 10 int
.
Что я надеюсь произвести на вас впечатление, так это то, что указатель формы (int *ptr)[10]
имеет некоторое соответствие двумерному массиву, тогда как указатель формы int *ptr
имеет некоторое соответствие одномерному массиву.
Как большой указатель 'Е ("% цу \ п", SizeOf arr1); '? -> может быть 4 или 8 и т. д. Насколько велика массив 'printf ("% zu \ n ", sizeof arr2);'? -> может быть 40 или 80 и т. д. – chux