是否通过指向C中允许的不完整数组类型来"重新格式化"多维数组?

Grz*_*ski 8 c c11

考虑以下声明:

int a[M][N]; // M and N are known compile-time
Run Code Online (Sandbox Code Playgroud)

如果它被宣布为:它是否合法对待它:

int a[N][M];
Run Code Online (Sandbox Code Playgroud)

甚至:

int a[A][B]; // where A * B = M * N
Run Code Online (Sandbox Code Playgroud)

在C中没有违反规则(严重)?

我发现它可以在没有任何演员阵容的情况下完成:

#include <stdio.h>

void print_array(int a[][2], int n);

int main(void)
{
    int a[2][3] = {{1, 2, 3}, {4, 5, 6}};

    //int (*p1)[2] = a; // compile error

    int (*ptr_temp)[] = a; // pointer to array of incomplete type
    int (*p2)[2] = ptr_temp; // compiles without any warning

    print_array(p2, 3);
}

void print_array(int a[][2], int n)
{
    for (int i = 0; i < n; i++)
        for (int j = 0; j < 2; j++)
            printf("a[%d][%d] = %d\n", i, j, a[i][j]);
}
Run Code Online (Sandbox Code Playgroud)

请注意,我们不能分配ap1直接指针.但是,编译器在p2分配时不会抱怨,ptr_temp即使它似乎有潜在危险(它不需要任何强制转换).它真的被消毒了吗?如果是这样,那为什么它不允许第一次转让呢?

Cob*_*sve 1

您看到的行为是由于 C 中处理多维数组的方式造成的。

看看这个问题:C 多维数组中的指针地址