コアの問題は、配列とポインタが同じではなく(それらは密接に関連していますが)、2D配列はポインタの配列ではないということです。
このコードは、問題を解決する3つの方法を示しています。配列a0
は配列の名前が変更され、再フォーマットされます。配列a
はポインタの配列であり、各ポインタはC99に追加された「複合リテラル」を介して5 int
の配列へのポインタです。私は渡された配列の25要素すべてを印刷するように印刷機能をアップグレードしました。また、渡された配列全体を印刷する異なるインタフェースを持つ2つの新しい印刷関数を作成しました。私は配列が正方形であると仮定します。 のようなのような変形では、pr1()
とほとんど同じですが、n
の代わりにj
をj
に対してテストするために内部的に調整する必要がある場合は、長方形(非正方形)の行列を簡単に処理できます。
#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
三つのブロックが同じです。選択肢があれば、インターフェイスでVLA(可変長配列)を使用してpr1()
というテクニックを使用します。 int **
引数を使用する必要がある場合は、配列a
などと非常によく似ている必要があります。確かにそれを作成する他の方法があります。例:
int *a[] = { a0[0], a0[1], a0[2], a0[3], a0[4] };
配列とポインタは同じではなく、ポインタへのポインタは2次元配列と同じではありません。 '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'の配列の先頭にあります。 –