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)?