Основная проблема заключается в том, что массивы и указатели не совпадают (хотя они тесно связаны), а 2D-массив не является массивом указателей.
Этот код показывает три способа устранить проблему. Массив a0
- ваш массив, переименованный и переформатированный; массив a
представляет собой массив указателей, и каждый указатель представляет собой указатель на массив из 5 int
через «составной литерал», добавленный в C99. Я обновил функцию печати, чтобы напечатать все 25 элементов массива, которые ей переданы, и создал две новые функции печати с различными интерфейсами, которые также распечатывают весь массив, переданный им. Я предполагаю, что массив квадратный; прямоугольная (неквадратная) матрица может быть легко обработана, особенно по варианту на pr1()
, например pr2(int n, int m, int a[n][m])
, который почти идентичен pr1()
, но для проверки j
требуется только одна настройка для m
вместо n
.
#include <stdio.h>
static void pr0(int a[][5]);
static void pr1(int n, int a[n][n]);
static void pr(int **a)
{
for (int i = 0; i < 5; i++)
{
for (int j = 0; j < 5; j++)
printf("%3d", a[i][j]);
putchar('\n');
}
putchar('\n');
}
int main(void)
{
int a0[5][5] =
{
{ 1, 4, 7, 11, 15 },
{ 2, 5, 8, 12, 19 },
{ 3, 6, 9, 16, 22 },
{ 10, 13, 14, 17, 24 },
{ 18, 21, 23, 26, 30 },
};
int *a[] =
{
(int[]){ 1, 4, 7, 11, 15 },
(int[]){ 2, 5, 8, 12, 19 },
(int[]){ 3, 6, 9, 16, 22 },
(int[]){ 10, 13, 14, 17, 24 },
(int[]){ 18, 21, 23, 26, 30 },
};
pr(a);
pr0(a0);
pr1(5, a0);
return 0;
}
static void pr0(int a[][5])
{
for (int i = 0; i < 5; i++)
{
for (int j = 0; j < 5; j++)
printf("%3d", a[i][j]);
putchar('\n');
}
putchar('\n');
}
static void pr1(int n, int a[n][n])
{
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
printf("%3d", a[i][j]);
putchar('\n');
}
putchar('\n');
}
Образец выход удивительно однородным:
1 4 7 11 15
2 5 8 12 19
3 6 9 16 22
10 13 14 17 24
18 21 23 26 30
1 4 7 11 15
2 5 8 12 19
3 6 9 16 22
10 13 14 17 24
18 21 23 26 30
1 4 7 11 15
2 5 8 12 19
3 6 9 16 22
10 13 14 17 24
18 21 23 26 30
Три блоки являются одинаковыми.Учитывая выбор, я использовал бы технику в pr1()
, используя VLAs (массивы переменной длины) в интерфейсе. Если вы должны придерживаться аргумента int **
, вы должны придерживаться массива a
или чего-то подобного. Конечно, есть другие способы создать это. Например:
int *a[] = { a0[0], a0[1], a0[2], a0[3], a0[4] };
Массивы и указатели не совпадают, а указатель на указатели - это не то же самое, что 2D-массив. Вы должны использовать 'void pr (int a [] [5])' или подобное. –
Что делать, если функция pr не может быть изменена? – user7341005
Тогда вам понадобится другая структура массива в 'main()': 'int * a [] = {(int []) {1, 4, 7, 11, 15}, (int []) {2, 5, 8, 12, 19}, (int []) {3, 6, 9, 16, 22}, (int []) {10, 13, 14, 17, 24}, (int []) {18, 21 , 23, 26, 30}}; '- не скомпилирован, поэтому у меня может быть ошибка. Я использую сложные литераторы C99. Это дает вам массив указателей на 'int', но каждый указатель находится в начале массива' int'. –