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?