Alias de matrices multidimensionales

Es bien sabido que una matriz 2D es una matriz de matrices, y que el estándar requiere que seaun conjunto de objetos no vacíos asignados de forma contigua (6.2.5 Tipos §20): el objeto es una matriz 1D aquí.

También es bien sabido que para todas las implementaciones comunes, la siguiente igualdad es verdadera paraT arr2d[X][Y] donde T es un tipo y las constantes integrales X e Y:

(char *) &arr2d[i][j] == (char *) &arr2d[0][0] + i * Y * sizeof(T) + j * sizeof(T)

Lo anterior permite pensar que se podría permitir alias una matriz 2D y una matriz 1D del mismo tamaño, o incluso otra matriz 2D del mismo tamaño total:

Por ejemplo, el siguiente programa compila y se ejecuta sin advertencias, y proporciona el resultado esperado:

#include <stdio.h>

int main() {
    int i, j, k=0;
    int arr2d[3][4];   // array of 3 array of 4 ints
    int *arr1 = &arr2d[0][0];  // pointer to first element of an array of 12 ints (1)
    int (*arrx)[3] = (int(*)[3]) arr1; //pointer to first row of an array of arrays of 3 ints
                                       //(2)

    for (i=0; i<12; i++) arr1[i] = k++; // (3)

    for (i=0; i<3; i++) {
        for (j=0; j<4; j++) {
            printf("%3d", arr2d[i][j]);
        }
        putc('\n', stdout);
    }
    for (i=0; i<4; i++) {
        for (j=0; j<3; j++) {
            printf("%3d", arrx[i][j]); 
        }
        putc('\n', stdout);
    }
    return 0;
}

Pero:

línea (1) y (3)alias una matriz 2D de 3x4 a una matriz 1D 12línea 2)alias una matriz 2D 3x4 a una matriz 2D 4x3 (a través de un puntero a int)

Mis preguntas son:

¿son (1) y (3) válidos de acuerdo con el estándar C?en caso afirmativo, ¿es válido (2)?

Respuestas a la pregunta(1)

Su respuesta a la pregunta