printf
函数返回0
而不是数字数组3 2 2
:int main(){
int mat[2][2][2] = {{3,1,1},{2,2,2}};
printf("first x, 2nd y, 2nd z = %d\n",mat[0][1][1]);
}
虽然在C中使用X by Y矩阵在C中检索任何值XxY都是一件轻而易举的事,但是一旦我添加了另一个维度,便遇到了这个问题。我想我一定对C处理数组中的坐标的方式有误解。非常感谢!
int mat [2] [2] [2] = {{3,1,1},{2,2,2}};
您声明了一个3D数组,但您为2D进行了初始化,值未放置在您期望的位置
#include <stdio.h>
int main(){
int mat[2][2][2] = {{3,1,1},{2,2,2}};
for (int i = 0; i != 2; ++i)
for (int j = 0; j != 2; ++j)
for (int k = 0; k != 2; ++k)
printf("%d %d %d -> %d\n", i, j, k, mat[i][j][k]);
return 0;
}
执行:pi @ raspberrypi:/ tmp $ ./a.out
0 0 0 -> 3 0 0 1 -> 1 0 1 0 -> 1 0 1 1 -> 0 1 0 0 -> 2 1 0 1 -> 2 1 1 0 -> 2 1 1 1 -> 0 pi@raspberrypi:/tmp $
此外,因为您的数组有8个int,但是init值只有6个,因此编译器将0初始化为两个未指定的条目
mat[0][1][1]
没有显式的初始化程序。因此它被初始化为零。然后您有这样的声明
int mat[2][2][2] = {{3,1,1},{2,2,2}};
然后,数组mat [0]的第一个元素作为集合由该列表{3,1,1}初始化,而数组mat [1]的第二个元素由该列表{2,,2初始化。 2}。关于元素mat [0]的元素,这些元素又没有指定大括号,那么mat [0]的元素将依次初始化,如
mat[0][0][0] = 3 mat[0][0][1] = 1 mat[0][1][0] = 1
元素(数组)mat [0]的所有其他元素初始化为零。这里是演示程序。
#include <stdio.h> int main(void) { int a[2][2][2] = {{3,1,1},{2,2,2}}; printf( "%d, %d, %d\n", a[0][0][0], a[0][0][1], a[0][1][0] ); printf( "%d, %d, %d\n", a[1][0][0], a[1][0][1], a[1][1][0] ); return 0; }
其输出为
3, 1, 1 2, 2, 2
0
:int main(){
int mat[2][2][2] = {{3,1,1},{2,2,2}};
for(int i = 0; i < 2; i++)
for(int j = 0; j < 2; j++)
for(int k = 0; k < 2; k++)
printf("mat[%d][%d][%d] = %d \n", i, j, k, mat[i][j][k]);
return 0;
}
输出:
mat[0][0][0] = 3 mat[0][0][1] = 1 mat[0][1][0] = 1 mat[0][1][1] = 0 mat[1][0][0] = 2 mat[1][0][1] = 2 mat[1][1][0] = 2 mat[1][1][1] = 0
当您声明:
int mat[2][2][2] = {{3,1,1},{2,2,2}};
这意味着您在程序中使用的是2D数组,而不是3D。
#include <cstdio>
int main(){
int mat[2][2][2] = {
{{3, 3}, {1, 1}},
{{1, 1}, {1, 1}}
};
printf("first x, 2nd y, 2nd z = %d\n", mat[0][1][1]);
}
如果您turn on warnings,您应该看到类似以下的警告:
test.c:4:26: warning: suggest braces around initialization of subobject [-Wmissing-braces]
int mat[2][2][2] = {{3,1,5},{2,2,2}};
...more like that...
test.c:6:44: warning: format specifies type 'int' but the argument has type 'int *' [-Wformat]
printf("z for first coordinate = %d\n",mat[0][2]);
~~ ^~~~~~~~~
test.c:6:44: warning: array index 2 is past the end of the array (which contains 2 elements)
[-Warray-bounds]
printf("z for first coordinate = %d\n",mat[0][2]);
^ ~
test.c:4:5: note: array 'mat' declared here
int mat[2][2][2] = {{3,1,5},{2,2,2}};
^
int mat[2][2][2]
会像这样初始化。
int mat[2][2][2] = { { {3,1}, {1,1}, }, { {1,1}, {2,2}, } };
您将永远不会从3 2 2
中获得mat[0][1][1]
。它只会返回单个值。在这种情况下,1。
如果要存储2个3D坐标的列表,请改用[2] [3]。
int mat[2][3] = {{3,1,1},{2,2,2}};
询问第一个x和第二个y的z是没有意义的。这就像问新泽西州丹佛市的高度是多少(丹佛在科罗拉多州)。第一个x和第二个y是两个不同坐标的一部分,并且具有不同的z。相反,您可以像这样获得第一个坐标的z。
printf("z for first coordinate = %d\n",mat[0][2]);
第一个坐标为mat[0]
,其z为第三个属性,即第二个索引。mat[0][2]
。