¿La matriz 2d es un puntero doble? [duplicate]

5 minutos de lectura

avatar de usuario
Angus

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 bidimensional como parámetro, se encasilla en (*matriz)[2] … de qué tipo almacena el compilador esta matriz como… ¿se almacena como una matriz bidimensional o como un puntero doble o como un puntero a una matriz? Si se almacena como una matriz, ¿cómo se interpreta de manera diferente en diferentes situaciones? como arriba Por favor, ayúdame a entender.

  • Los punteros no son matrices y las matrices no son punteros. Matrices (cualquiera que sea la dimensión que tengan) decadencia en punteros (únicos) cuando se pasan a funciones.

    – Alejandro C.

    28 de septiembre de 2011 a las 16:52

  • (int) matrix es algo sin sentido. obliga matrix para decaer dos veces a un puntero a un número entero, pero el resultado de convertir un puntero a un número entero no está definido.

    –David Schwartz

    28 de septiembre de 2011 a las 16:58


  • @David Schwartz: (int)matrix decaería matrix una vez (no dos veces), y el resultado no es indefinido, sino definido por la implementación.

    – jpalecek

    28 de septiembre de 2011 a las 17:17

  • @jpalecek: Implementación definida significa que la implementación es libre de hacer lo que quiera. Entonces, si no conoce la implementación, no tiene una definición. En el contexto donde se desconoce la implementación, no está definida. (No en el sentido formal de ‘indefinido’, en el sentido normal).

    –David Schwartz

    28 de septiembre de 2011 a las 17:22

  • En C, no envíe el resultado de una llamada a malloc(), realloc()o calloc() – es innecesario y potencialmente enmascara el grave error de un prototipo faltante.

    – mlp

    15 de julio de 2019 a las 16:16

avatar de usuario
jpalecek

¿La matriz 2d es un puntero doble?

No. Esta línea de su 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 los arreglos multidimensionales no son diferentes de las de los arreglos ordinarios, simplemente sustituya el tipo de arreglo “interno” 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 el elemento matrix[x][y]usted toma the base address of matrix + x*4 + y (4 es el tamaño de la matriz interna).

Cuando los arreglos se pasan a funciones, decaen en punteros a su primer elemento. Como te habrás dado cuenta, esto sería int (*)[4]. Él 4 in the type le diría al compilador el tamaño del tipo interno, por lo que funciona. Al hacer aritmética de punteros en un puntero similar, el compilador agrega múltiplos del tamaño del elemento, por lo que para matrix_ptr[x][y]usted obtiene matrix_ptr + x*4 + yque es exactamente igual que el anterior.

El elenco ptr=(int**)matrix por lo tanto es incorrecto. 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 matrix[1] en cualquier lugar de la memoria del programa.

Nota: los cálculos en esta publicación asumen sizeof(int)==1para evitar una complejidad innecesaria.

avatar de usuario
Dmitri

No. Una matriz multidimensional es un solo bloque de memoria. El tamaño del bloque es el producto de las dimensiones multiplicadas por el tamaño del tipo de los elementos, y la indexación en cada par de corchetes se compensa 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 ints. arr[0][0][0] da el primero, arr[1][0][0] da el séptimo (compensas por 3 * 2). arr[0][1][0] da el tercero (compensado por 2).

Los punteros a los que decae la matriz dependerán del nivel; arr decae a un puntero a una matriz int de 3×2, 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, porque debe establecer cada puntero en 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, obtiene la capacidad de tener subarreglos de diferentes tamaños y cambiar el lugar donde apuntan los punteros, lo cual es útil si es necesario cambiar su tamaño o reorganizarlos. Una matriz de punteros como este se puede indexar como una matriz multidimensional, aunque se asigna y organiza de manera diferente y sizeof no siempre se comportará de la misma manera con él. Un ejemplo asignado estáticamente de esta configuración 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 la int encontrado en 1 * 2 * sizeof(int) bytes más allá de la dirección de inicio de la matriz arrda la int encontrado en 0 * sizeof(int) bytes más allá de la dirección señalada por arr[1]. También, sizeof(arr[0]) es equivalente a sizeof(int *) en vez de sizeof(int) * 2.

En C, no hay nada especial que deba saber para comprender las matrices multidimensionales. Funcionan exactamente de la misma manera que si nunca se mencionaran específicamente. Todo lo que necesita saber es que puede crear una matriz de cualquier tipo, incluida una matriz.

Así que cuando veas:

matriz int[2][4];

Solo piensa, “matrix es una matriz de 2 cosas, esas cosas son matrices de 4 enteros”. Se aplican todas las reglas normales para las matrices. Por ejemplo, matrix puede decaer fácilmente en un puntero a su primer miembro, como cualquier otra matriz, que en este caso es una matriz de cuatro enteros. (Que, por supuesto, puede decaer en sí mismo).

  • int matrix[X][Y] es estático asignación, por lo que también necesita saber X, Y dimensiones en tiempo de compilación.

    – joepol

    10 de marzo de 2020 a las 21:24

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad