**如何在二维数组中工作?

Avi*_*vaT 1 c pointers multidimensional-array

int main(void) {
    unsigned int x[4][3] = {(1,2,3),(4,5,6),(7,8,9),(17,11,12)};
    printf("%d, %u, %u, %u \n",**x, **(x+1), **(x+2), **(x+3));
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

上面代码的输出是3,12,0,0.不应该是1,4,7,17​​,因为x存储数组的第一个元素的地址?

当我试图打印时

printf("%u, %u \n", x, &x[0][0] );
Run Code Online (Sandbox Code Playgroud)

它显示了相同的地址2108666688,2108666688

但是当我尝试使用打印数组时

for(int i = 0; i<4; ++i)
{
    for(int j = 0; j<3 ; ++j)
    {
        printf("%d ",x[i][j]);
    }
    printf("\n");
}
Run Code Online (Sandbox Code Playgroud)

我看到输出为

3 6 9 
12 0 0 
0 0 0 
0 0 0 
Run Code Online (Sandbox Code Playgroud)

那么,到底发生了什么?为什么没有将数字正确分配给数组?

usr*_*usr 6

unsigned int x[4][3] = {(1,2,3),(4,5,6),(7,8,9),(17,11,12)};
Run Code Online (Sandbox Code Playgroud)

在功能上等同于:

unsigned int x[4][3] = {3, 6, 9, 12};
Run Code Online (Sandbox Code Playgroud)

因为逗号运算符在这里工作!逗号运算符计算其所有操作数并生成其最后一个操作数的结果.

所以你看到的输出是预期的.你可能意味着:

unsigned int x[4][3] = {{1,2,3},{4,5,6},{7,8,9},{17,11,12}};
Run Code Online (Sandbox Code Playgroud)