funciones - punteros y matrices en c
¿2d array es un puntero doble? (4)
¿2d array es un puntero doble?
No. Esta línea de tu programa es incorrecta:
int **ptr = (int**)matrix;
Esta respuesta trata del mismo tema
Si desea una imagen concreta de cómo se implementan las matrices multidimensionales:
Las reglas para las matrices multidimensionales no son diferentes de las de las matrices ordinarias, solo sustituye el tipo de matriz "interna" como tipo de elemento. Los elementos de la matriz se almacenan en la memoria directamente uno detrás del otro:
matrix: 11 22 33 99 44 55 66 110
----------- the first element of matrix
------------ the second element of matrix
Por lo tanto, para abordar la matrix[x][y]
elementos matrix[x][y]
, se toma the base address of matrix + x*4 + y
(4 es el tamaño de la matriz interna).
Cuando las matrices se pasan a las funciones, decaen a punteros a su primer elemento. Como habrás notado, esto sería int (*)[4]
. El 4
en el tipo le diría al compilador el tamaño del tipo interno, por eso funciona. Al hacer aritmética de puntero en un puntero similar, el compilador agrega múltiplos del tamaño del elemento, por lo que para matrix_ptr[x][y]
, obtienes matrix_ptr + x*4 + y
, que es exactamente igual a la anterior.
Por lo tanto, la ptr=(int**)matrix
es incorrecta. Por una vez, *ptr
significaría un valor de puntero almacenado en la dirección de la matriz, pero no hay ninguno. En segundo lugar, no hay un puntero a la matrix[1]
en ningún lugar de la memoria del programa.
Nota: los cálculos en esta publicación suponen sizeof(int)==1
, para evitar una complejidad innecesaria.
Esta pregunta ya tiene una respuesta aquí:
int main()
{
matrix[2][4] = {{11,22,33,99},{44,55,66,110}};
int **ptr = (int**)matrix;
printf("%d%d",**matrix,*ptr);
}
Pero cuando se pasa una matriz de 2 d como parámetro, se escribe en (matriz *) [2] ... ¿qué tipo almacena el compilador esta matriz como ... está almacenando como una matriz de 2 d o un puntero doble? o un puntero a una matriz ... Si está almacenando como una matriz, ¿cómo interpreta de manera diferente en diferentes situaciones como la anterior? Por favor, ayúdame a entender.
En C, no hay nada especial que necesite saber para comprender matrices multidimensionales. Funcionan exactamente de la misma manera que si nunca se los mencionara específicamente. Todo lo que necesita saber es que puede crear una matriz de cualquier tipo, incluida una matriz.
Entonces cuando ves:
matriz int [2] [4];
Solo piense, "la matrix
es una matriz de 2 cosas, esas cosas son matrices de 4 enteros". Se aplican todas las reglas normales para matrices. Por ejemplo, la matrix
puede decaer fácilmente en un puntero a su primer miembro, al igual que cualquier otra matriz, que en este caso es una matriz de cuatro enteros. (Que puede, por supuesto, decaer).
No. Una matriz multidimensional es un solo bloque de memoria. El tamaño del bloque es el producto de las dimensiones multiplicado por el tamaño del tipo de los elementos, y la indexación en cada par de corchetes compensaciones en la matriz por el producto de las dimensiones para las dimensiones restantes. Asi que..
int arr[5][3][2];
es una matriz que contiene 30 int
s. arr[0][0][0]
da la primera, arr[1][0][0]
da la séptima (compensaciones por 3 * 2). arr[0][1][0]
da la tercera (compensaciones por 2).
Los punteros a los que decae la matriz dependerán del nivel; arr
desintegra a un puntero a una matriz int 3x2, arr[0]
decae a un puntero a una matriz int de 2 elementos, y arr [0] [0] decae a un puntero a int.
Sin embargo, también puede tener una matriz de punteros y tratarla como una matriz multidimensional, pero requiere una configuración adicional, ya que debe establecer cada puntero a su matriz. Además, pierde la información sobre los tamaños de las matrices dentro de la matriz ( sizeof
daría el tamaño del puntero). Por otro lado, obtienes la capacidad de tener sub-arrays de diferentes tamaños y cambiar el punto al que apuntan los punteros, lo que es útil si es necesario cambiar su tamaño o reorganizarlos. Una matriz de indicadores como este se puede indexar como una matriz multidimensional, aunque se asigne y organice de manera diferente y sizeof
no siempre se comportará de la misma manera con ella. Un ejemplo de esta configuración asignado estadísticamente sería:
int *arr[3];
int aa[2] = { 10, 11 },
ab[2] = { 12, 13 },
ac[2] = { 14, 15 };
arr[0] = aa;
arr[1] = ab;
arr[2] = ac;
Después de lo anterior, arr[1][0]
es 12
. Pero en lugar de dar el int
encontrado en 1 * 2 * sizeof(int)
bytes más allá de la dirección de inicio de la matriz arr
, da el int
encontrado en 0 * sizeof(int)
bytes más allá de la dirección apuntada por arr[1]
. Además, sizeof(arr[0])
es equivalente a sizeof(int *)
lugar de sizeof(int) * 2
.
Si puede usar la pila para esa información (volumen pequeño), entonces generalmente define la matriz:
int matrix[X][Y]
Cuando desea asignarlo en el montón (gran volumen), generalmente define un:
int** matrix = NULL;
y luego asigne las dos dimensiones con malloc / calloc. Puede tratar la matriz 2d como int ** pero no es una buena práctica ya que hace que el código sea menos legible. Aparte de eso
**matrix == matrix[0][0] is true