Matrizes multidimensionais (C)
Uma expressão subscrita também pode ter vários subscritos, como segue:
expression1 [ expression2 ] [ expression3 ] /*...*/ ;
As expressões subscritas são associadas da esquerda para a direita. A expressão subscrita mais à esquerda, expression1[ expression2 ]
, é avaliada primeiro. O endereço resultante da adição de expression1
e expression2
forma uma expressão de ponteiro. Em seguida, expression3
é adicionado a essa expressão de ponteiro para formar uma nova expressão de ponteiro e assim por diante, até que a última expressão subscrita seja adicionada. O operador de indireção (*
) é aplicado depois que a última expressão subscrita é avaliada, a menos que o valor do ponteiro final trate de um tipo de matriz.
As expressões com vários subscritos referem-se a elementos de "matrizes multidimensionais". Uma matriz multidimensional é uma matriz cujos elementos são matrizes. Por exemplo, o primeiro elemento de uma matriz tridimensional é uma matriz com duas dimensões.
Exemplos
Para os exemplos a seguir, uma matriz chamada prop
é declarada com três elementos, cada um deles sendo uma matriz 4 por 6 de valores int
.
int prop[3][4][6];
int i, *ip, (*ipp)[6];
Uma referência à matriz prop
é semelhante a esta:
i = prop[0][0][1];
O exemplo mostra como fazer referência ao segundo elemento int
individual de prop
. As matrizes são armazenadas por linha, de modo que o último subscrito varie mais rapidamente; a expressão prop[0][0][2]
se refere ao próximo (terceiro) elemento da matriz, e assim por diante.
i = prop[2][1][3];
Essa instrução é uma referência mais complexa a um elemento individual de prop
. A expressão é avaliada como segue:
O primeiro subscrito,
2
, é multiplicado pelo tamanho de uma matrizint
4 por 6 e é adicionado ao valor do ponteiroprop
. O resultado aponta para a terceira matriz 4 por 6 deprop
.O segundo subscrito,
1
, é multiplicado pelo tamanho da matrizint
de 6 elementos e é adicionado ao endereço representado porprop[2]
.Cada elemento da matriz de seis elementos é um valor
int
, portanto, o subscrito final,3
, é multiplicado pelo tamanho de umint
antes de ser adicionado aprop[2][1]
. O ponteiro resultante é pertinente ao quarto elemento da matriz de 6 elementos.O operador de indireção é aplicado ao valor do ponteiro. O resultado é o elemento
int
nesse endereço.
Estes dois exemplos mostram casos em que o operador de indireção não é aplicado.
ip = prop[2][1];
ipp = prop[2];
Na primeira instrução, a expressão prop[2][1]
é uma referência válida à matriz tridimensional prop
e refere-se a uma matriz de seis elementos (já declarada). Como o valor do ponteiro trata de uma matriz, o operador de indireção não é aplicado.
Da mesma forma, o resultado da expressão prop[2]
na segunda instrução ipp = prop[2];
é um valor de ponteiro pertinente a uma matriz bidimensional.