voy a tratar de dibujar la forma
int array[10][6];
y
int **array2 = new int *[10];
for (int i = 0; i < 10; ++i)
array2[i] = new int[6]
mirada al igual que en la memoria y en qué son diferentes (y que no se pueden lanzar el uno al otro)
array
parece:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
| | | | | | | | | | | | | ..............| | | (10*6 elements of type int)
- - - - - - - - - - - - - - - - - - - - - -
< first row >< second row> ...
array2
parece:
_ _ _ _ _ _ _ _ _ _
| | | | | | | | | | | (10 elements of type int *)
- - - - - - - - - -
| | .... | _ _ _ _ _ _
| | \-->| | | | | | | (6 elements of type int)
| | - - - - - -
| |
| | _ _ _ _ _ _
| \ -->| | | | | | | (6 elements of type int)
| - - - - - -
|
|
| _ _ _ _ _ _
\ -->| | | | | | | (6 elements of type int)
- - - - - -
Cuando dice array[x][y]
, que se traduce en *(((int *)array)+x*6+y)
Mientras que, cuando se dice array2[x][y]
, que se traduce en *(*(array2+x)+y)
Es decir, una matriz 2d estática es en de hecho, una matriz de 1d con filas puestas en una línea. El índice se calcula con la fórmula row * number_of_columns_in_one_row + column
.
Una matriz dinámica de 2d, sin embargo, es solo una matriz de punteros de 1d. Cada puntero se asigna dinámicamente para apuntar a otra matriz de 1d. En verdad, ese puntero podría ser cualquier cosa. Podría ser NULL
, o apuntando a una sola variable, o apuntando a otra matriz. Y cada uno de esos punteros se configuran individualmente, por lo que pueden tener diferentes naturalezas.
Si tiene que pasar el puntero del array
algún lugar, no se puede echarlo a int **
(imaginar lo que sucedería Los int
valores de las celdas de array
se interpretan como punteros y dereferenced -.> Bam Fallo de segmentación!) Sin embargo, puede pensar en array
como una matriz de 1d de int [6]
s; es una matriz de elementos 1d, con el tipo int [6]
. Para escribirlo, diga
int (*p)[6] = array;
¿Qué código ha compilado que sea similar al código en su pregunta? –
Huye de matrices multidimensionales (excepto quizás las pequeñas). –
@Alexandre C. Las matrices multidimensionales son simples, útiles y eficientes. ¿Por qué querrías escaparte de ellos? – Shahbaz