2011-01-30 9 views
5

estoy teniendo un montón de problemas para entender las matrices multidimensionales Deje una matriz seamatriz multi-dimensional en C++, un misterio para mí :(

x[2]; // now x is constant pointer to first element i.e x's name is address of x[0] 

Ahora matriz bidimensional:.

x[2][5]; // here x is address of x[0] which contains the address of first element of array x[][0]; 

Ahora el puntero

int(*y)[5]; 

es un puntero a la matriz 5 de enteros. ¿Cómo es posible escribir y = x?

Ahora que estaba haciendo un poco de práctica para entender esto en VS, que está aquí, y mi pregunta principal es en la imagen:

http://img184.imagevenue.com/img.php?image=96382_first_122_1120lo.jpg

Por favor, responde a la pregunta conceptualmente; ¿Cómo C++ tiendas matriz multidimensional, etc.

Voy a apreciar cualquier ayuda mucho :)

+0

Lea http://c-faq.com/aryptr/index.html –

+1

Le recomendamos que lea [Preguntas frecuentes] (http://stackoverflow.com/questions/4810664/) acerca del uso de matrices en C++;) – fredoverflow

Respuesta

6

Look: cualquier matriz multidimensional es la matriz de matrices. P.ej. x[2][5] será igual a esta tabla:

x[0][0]x[0][1]x[0][2]x[0][3]x[0][4]

x[1][0]x[1][1]x[1][2]x[1][3]x[1][4]

asignación de puntero sería exactamente el mismo: x[0] es la primera fila de la tabla 2x5, por lo int *y = x[0] o int *y = x[1] copiará la dirección de la primera fila al y.

Pero si lo hace int (*y) = x lo memoriza la dirección de x[0][0] en y variable (int y crea una instancia int mientras int (*y) le da la dirección de esta instancia).

UPD: Tengamos int **x variable. No importa qué tamaño tenga. Simplemente tome esto como una verdad que x, x[0] y x[0][0] le proporcionaría la misma dirección. Esto podría explicarse como Pointer name means its address. Multi-dimensional array is a pointer to pointer. Its name means address of pointer it's pointing on which means address of the last pointer' first element. (lo siento por complicidad).

+0

+1 por cantidad de ejemplos –

3

Como el nombre de una matriz unidimensional se considera el puntero del primer elemento, la construcción x [0] es puntero a la primera matriz de su matriz 2d yx [1] es el puntero a tu segundo arreglo Entonces, solo piense en x [0] ya que es el nombre de su 1ra matriz. Agregar otro par de corchetes (como x [0] [0]) le devolverá el valor del elemento. Y la dirección del primer elemento sería & x [0] [0] o simplemente x [0].

7

Como han señalado otros, una matriz multidimensional es una matriz de matrices, no una matriz de punteros.

Creo que la principal causa de malentendidos es el concepto de que cualquier matriz es realmente un puntero.Pero no es estrictamente cierto. Una matriz es una variable que contiene una colección contigua de elementos de un mismo tipo. Entonces, cuando declaras una matriz como int x[2], estás declarando una variable que contiene dos enteros. Tenga en cuenta que no contiene ningún puntero.

Ahora la raíz de este malentendido común es que en C/C++ un nombre de matriz evalúa a la dirección de su primer elemento y, por lo tanto, se puede utilizar como un puntero. En otras palabras, cuando escribe x, significa implícitamente &x o &x[0]. Esto probablemente fue hecho para hacer las expresiones más legibles.

Una matriz multidimensional es simplemente una matriz de matrices. En otras palabras, la misma lógica se aplica a ellos, no hay nada especial. Lees la declaración C/C++ comenzando por el nombre y yendo afuera, aplicando modificadores a medida que los encuentras, primero [] y(), luego *, luego escribes, para que interpretes una matriz multidimensional como esta (orden de lectura especificado explícitamente)):

int    x  [    2]   [   5]; 
6. "of type int" 1. "x" 2. "is an array" 3. "of 2". 4. "arrays" 5. "of 5 elements" 

lo que no hay tal cosa como matrices multidimensionales en C/C++, pero no hay tal cosa como matriz unidimensional de matrices unidimensionales. De acuerdo con las reglas para matrices unidimensionales, x, &x y &x[0] todas evalúan a la dirección del primer elemento. Pero dado que el primer elemento es una matriz, x[0] evalúa la dirección de esa matriz, es decir, la dirección de su primer elemento que es una int. Lo mismo ocurre con &x[0] y &x[0][0]. Es por eso que el valor de x[0] es el mismo de su dirección, porque x[0] es una matriz.

Tenga en cuenta que aunque estas cosas se evalúan en la misma dirección, tienen diferentes tipos. x es un puntero a una matriz de 5 ints, así como &x[0], ya que ambos evalúan la dirección del primer elemento de x. x[0] evalúa a la dirección del primer elemento de x[0], por lo que es un puntero a int, lo mismo ocurre con &x[0][0]. En este ejemplo se compila bien e imprime la misma dirección para los 4 punteros:

int x[2][5]; 
    int (*y1)[5] = x; 
    int *y2 = x[0]; 
    int (*y3)[5] = &x[0]; 
    int *y4 = &x[0][0]; 
    printf("%p %p %p %p\n", y1, y2, y3, y4); 

Ahora, hay diferentes diseños de memoria para matrices utilizadas en diferentes idiomas. Por ejemplo, para una matriz bidimensional, puede agrupar elementos por filas o columnas. En C/C++, dado que no existen matrices multidimensionales "verdaderas", el diseño de la memoria se define implícitamente mediante las reglas anteriores. Desde int x[2][5], que se puede considerar como una matriz bidimensional que tiene 2 filas y 5 columnas, en realidad es una matriz de 2 matrices, cada una de las cuales representa una fila, se obtiene el diseño "grupo por filas", que se presenta en La respuesta de shybovycha.

Tenga en cuenta que también es posible crear una matriz de punteros y utilizarla como una matriz multidimensional. Las diferencias con las matrices multidimensionales "habituales" son:

  1. Una matriz de punteros contiene punteros en su interior. Es decir, direcciones de los primeros elementos de sub-arrays.
  2. El diseño de la memoria no es contiguo. Cada subarreglo se puede asignar en cualquier lugar, por ejemplo, utilizando malloc() o nuevo [].
  3. Las sub-matrices pueden ser de diferentes tamaños.

La ventaja de este enfoque es que se puede utilizar esta matriz como un puntero a puntero (por ejemplo, int **y), lo que hace que todas las matrices multidimensionales de este tipo compatibles entre sí, incluso si tienen diferentes tamaños.Pero los tamaños deben almacenarse por separado en este caso.

Cuestiones relacionadas