C no tiene ningún soporte específico para matrices multidimensionales. Una matriz bidimensional como double inputMatrix[N][M]
es solo una matriz de longitud N
cuyos elementos son matrices de longitud M
de dobles.
Hay circunstancias en las que puede dejar fuera el número de elementos en un tipo de matriz. Esto da como resultado un tipo incompleto - un tipo cuyos requisitos de almacenamiento son desconocidos. Por lo tanto, puede declarar double vector[]
, que es una matriz de tamaño no especificado de dobles. Sin embargo, no puede colocar objetos de tipos incompletos en una matriz, porque el compilador necesita saber el tamaño del elemento cuando accede a los elementos. Por ejemplo, puede escribir double inputMatrix[][M]
, que declara una matriz de longitud no especificada cuyos elementos son matrices de longitud M
de dobles. El compilador sabe entonces que la dirección de inputMatrix[i]
es i*sizeof(double[M])
bytes más allá de la dirección de inputMatrix[0]
(y por lo tanto la dirección de inputMatrix[i][j]
es i*sizeof(double[M])+j*sizeof(double)
bytes). Tenga en cuenta que necesita saber el valor de M
; esta es la razón por la que no puede dejar M
en la declaración de inputMatrix
.
Una consecuencia teórica de cómo se presentan las matrices es que inputMatrix[i][j]
denota la misma dirección que inputMatrix + M * i + j
.¹
Una consecuencia práctica de esta disposición es que, para un código eficiente, se debe organizar las matrices de manera que la dimensión que varía más a menudo viene último. Por ejemplo, si tiene un par de bucles anidados, hará un mejor uso de la memoria caché con for (i=0; i<N; i++) for (j=0; j<M; j++) ...
que con bucles anidados al revés. Si necesita cambiar entre el acceso a la fila y el acceso a la columna a mitad del programa, puede ser beneficioso transponer la matriz (lo que se hace mejor bloque por bloque en lugar de columnas o líneas).
C89 referencias: §3.5.4.2 (tipos de matriz), §3.3.2.1 (expresiones subíndice de matriz)
C99 referencias: §6.7.5.2 (tipos de matriz), §6.5.2.1-3 (expresiones subíndice de matriz) .
¹ Demostrar que esta expresión está bien definida se deja como un ejercicio para el lector. No es muy claro si inputMatrix[0][M]
es una forma válida de acceder al inputMatrix[1][0]
, aunque sería extremadamente difícil para una implementación marcar la diferencia.
Agregue el mensaje de error, el nombre del compilador y la versión a su pregunta. –