Das Kernproblem ist, dass Arrays und Zeiger nicht identisch sind (obwohl sie eng verwandt sind), und ein 2D-Array ist kein Array von Zeigern.
Dieser Code zeigt drei Möglichkeiten, das Problem zu beheben. Das Array a0
ist Ihr Array umbenannt und neu formatiert; Das Array a
ist ein Array von Zeigern, und jeder Zeiger ist ein Zeiger auf ein Array von 5 int
über ein 'Compound Literal', eine Funktion, die zu C99 hinzugefügt wurde. Ich habe die Druckfunktion aktualisiert, um alle 25 Elemente des Arrays zu drucken, das an sie übergeben wird - und zwei neue Druckfunktionen mit verschiedenen Schnittstellen erstellt, die auch das gesamte an sie übergebene Array drucken. Ich nehme an, das Array ist quadratisch; eine rechteckige (nicht quadratische) Matrix leicht gehandhabt werden kann, insbesondere durch eine Variante auf pr1()
wie pr2(int n, int m, int a[n][m])
- die fast identisch mit pr1()
ist aber benötigen eine einzige Einstellung intern j
gegen m
anstelle von n
zu testen.
#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');
}
Die Probe Ausgang ist wunderbar einheitlich:
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
Die drei Blöcke gleich sind.Gegeben eine Wahl, würde ich die Technik in pr1()
verwenden, die VLAs (Arrays mit variabler Länge) in der Schnittstelle verwendet. Wenn Sie mit dem Argument int **
bleiben müssen, müssen Sie mit dem Array a
, oder etwas ganz ähnliches bleiben. Es gibt sicherlich andere Möglichkeiten, das zu schaffen. Zum Beispiel:
int *a[] = { a0[0], a0[1], a0[2], a0[3], a0[4] };
Arrays und Zeiger sind nicht identisch, und ein Zeiger auf Zeiger ist nicht dasselbe wie ein 2D-Array. Sie sollten 'void pr (int a [] [5])' oder ähnliches verwenden. –
Was passiert, wenn die Funktion pr nicht geändert werden kann? – user7341005
Dann müssen Sie eine andere Anordnungsstruktur in '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}}; '- nicht kompiliert, damit ich einen Fehler habe. Ich benutze C99 zusammengesetzte Literale. Dies gibt Ihnen ein Array von Zeigern zu "int", aber jeder Zeiger ist auf den Anfang eines Arrays von "int". –