核心问题是数组和指针不一样(尽管它们密切相关),而2D数组不是指针数组.
此代码显示了解决问题的三种方法.数组a0
是您重命名和重新格式化的数组; 数组a
是一个指针数组,每个指针都是一个指向5数组的指针,int
通过'复合文字',这是一个添加到C99的功能.我已经升级了打印功能,以打印传递给它的所有25个元素元素 - 并创建了两个具有不同接口的新打印功能,这些接口也打印传递给它们的整个数组.我假设阵列是方形的; 的矩形(非方形)矩阵可容易地处理,尤其是通过在一个变体pr1()
如pr2(int n, int m, int a[n][m])
-这几乎是相同的pr1()
,但需要一个单一的调整内部测试j
针对m
代替n
.
#includestatic 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()
,在界面中使用VLA(可变长度数组).如果你必须坚持int **
参数,你必须坚持使用数组a
或类似的东西.当然还有其他方法来创造它.例如:
int *a[] = { a0[0], a0[1], a0[2], a0[3], a0[4] };