Alias de matrizes multidimensionais

É sabido que uma matriz 2D é uma matriz de matrizes e que, por padrão, é necessário queum conjunto de objetos não vazio alocado de forma contígua (6.2.5 Tipos §20) - objeto sendo uma matriz 1D aqui.

Também é sabido que, para todas as implementações comuns, a seguinte igualdade é verdadeira paraT arr2d[X][Y] onde T é um tipo e constantes integrais X e Y:

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

Acima, vamos pensar que poderia ser permitido criar um alias de uma matriz 2D e uma matriz 1D do mesmo tamanho, ou mesmo outra matriz 2D do mesmo tamanho total:

Por exemplo, o seguinte programa compila e executa sem avisos e fornece a saída esperada:

#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;
}

Mas:

linhas (1) e (3)pseudônimo uma matriz 2D 3x4 a uma matriz 1D 12linha 2)pseudônimo uma matriz 2D 3x4 a uma matriz 2D 4x3 (via ponteiro para int)

Minhas perguntas são:

(1) e (3) são válidos de acordo com o padrão C?se sim, (2) é válido?

questionAnswers(1)

yourAnswerToTheQuestion