int matrix[9][9],*p;
p=matrix[0]; 

esto funciona y da la primera fila de matrix, pero, ¿cómo obtener la primera columna de matrix he intentado p=matrix[][0]; ? También no entiendo por qué se presenta a continuación el código de error del compilador ?

int matrix[9][9],p[9];  //it looks really ugly, byt why it doesn't work ?
p=matrix[0];            //compiler gives "invalid array assigment"

es debido a que las matrices multidimensionales son matrices de matrices – y que debemos interpretar matrix[i][j] como j-ésimo elemento de la i-ésima matriz anidada ?

InformationsquelleAutor Qbik | 2013-03-06

7 Comentarios

  1. 15

    En C/C++, las matrices multidimensionales se almacenan realmente como una dimensiones de las matrices (en la memoria). Su matriz 2D se almacena como una matriz unidimensional con hileras de primer orden. Esa es la razón por la obtención de una columna fuera de él no es fácil, y no proporcionan por defecto. No hay contiguos de la matriz en la memoria que usted puede obtener un puntero a la cual representa una columna de una matriz multidimensional. Ver más abajo:

    Al hacer p=matrix[0], se le acaba de llegar el puntero al primer elemento matrix[0][0], y que te hace pensar que tienes el puntero a la primera fila. En realidad, es un puntero a la totalidad de la contiguos matriz que contiene matrix, de la siguiente manera:

    matrix[0][0]
    matrix[0][1]
    matrix[0][2]
    .
    .
    matrix[1][0]
    matrix[1][1]
    matrix[1][2]
    .
    .
    matrix[8][0]
    matrix[8][1]
    matrix[8][2]
    .
    .
    matrix[8][8]

    Como se ha visto anteriormente, los elementos de cualquier columna están separados por otros elementos en las filas correspondientes.

    Así, como una nota de lado, con puntero p, se puede caminar a través de todo el 81 elementos de su matriz, si quería.

    • «Almacenado como arrays de una dimensión» es un poco de una extraña manera de decirlo. Sólo son matrices de matrices, así que voy a conceder que el diseño de memoria es similar, pero la semántica son un poco diferentes.
    • La semántica son diferentes, sí, me refería a la distribución de memoria. Voy a volver a escribir esa parte.
    • error, lo siento, realmente están uno al lado del otro en la memoria
  2. 8

    Usted puede conseguir la primera columna utilizando un bucle como

    for(int i = 0; i < 9; i++)
    {
        printf("Element %d: %d", i, matrix[i][0]);
    }

    Creo que la asignación no funciona correctamente porque usted está tratando de asignar algo que no es una dirección de un puntero.

    (Lo siento, este es el código c)

    • lo siento, pero yo quería solución genérica, ser feliz es tu primer post +1
    • Creo que debe ser matrix[i][0] como C y C++ se usa 0 como el primer elemento.
    • Esta es la manera de hacerlo. Usted tiene un bucle a través de la matriz para obtener los elementos que desee. No hay una manera fácil ya que, como se ha mencionado, los elementos no se encuentran contiguos en los lugares de la memoria.
  3. 3

    No hay ninguna diferencia entre la especificación de matrix[81] o matrix[9][9]

    matrix[r][c] simplemente significa lo mismo que matrix[9*r+c]

    Hay otros recipientes que se adapta mejor fort matrices multidimensionales como boost::multi_array

    http://www.boost.org/doc/libs/1_53_0/libs/multi_array/doc/index.html

    Pensar en el desnudo de la matriz como la asignación de una pieza contigua de memoria. Usted, el programador tiene que manejar esta pieza de memoria. El desnudo nombre de la matriz, por ejemplo, matrix es un puntero al primer elemento de esta asignado pieza de memoria. Luego *(matrix+1) es el mismo que matrix[0][1] o matrix[1].

    • Se tiene el convencimiento de que matrix[81] es el mismo que matrix[9][9]? Mi entendimiento es que matrix[9][9] es equivalente a int * matrix[9], lo que significa que es un recipiente de punteros, no contiguos de los lugares de la memoria.
    • Cuando se le preguntó que se convirtió seguro. Así que busqué y ahora estoy seguro. Ver aquí, por ejemplo, stackoverflow.com/questions/7784758/…
    • Acepto la corrección, gracias!
    • Necesito hacer una pequeña corrección a este. A partir de un diseño de memoria de punto de vista no hay ninguna diferencia. Pero si el compilador tiene información acerca de la matriz original de la declaración de que hay una diferencia en cómo se interpreta. Por ejemplo matrix[R][C] se puede acceder de forma lineal a partir de un puntero int* mp (int*)matrix, el elenco es necesario para evitar las advertencias. Usted puede obtener acceso a las filas como int (row_ptr*)[C] = matrix luego aritmética de punteros, se asegurará de mover una fila completa, por ejemplo, (row_ptr+1) se apuntan a la segunda fila. También se valora el acceso tiene que ser **(row_ptr+1). Hay, sin embargo, de los punteros en la memoria.
  4. 2

    p es una matriz de tipo int matriz[0] es un puntero..

    • pero p=*(matrix[0]); no funciona !
    • es un int, no se puede asignar un int a int matriz
    • ahora lo entiendo ! He impreso *p y datos correctos, pero sólo era puntero a solo int
  5. 1

    matrix en sí es lo más cercano que se puede llegar a una columna de la matriz, en cuanto (matrix + 1)[0][0] es el mismo que matrix[1][0].

  6. 0

    Si quieres que tu matriz a lugares contiguos, declare como una matriz unidimensional y realizar la fila y la columna de cálculos por ti mismo:

    int contiguous_matrix[81];
    
    int& location(int row, int column)
    {
      return contiguous_matrix[row * 9 + column];
    }

    También puede iterar sobre cada columna de una fila:

    typedef void (*Function_Pointer)(int&);
    
    void Column_Iteration(Function_Pointer p_func, int row)
    {
      row = row * MAXIMUM_COLUMNS;
      for (unsigned int column = 0; column < 9; ++column)
      {
        p_func(contiguous_matrix[row + column]);
      }
    }
  7. 0

    Estáticos, declaró matrices puede acceder a ellos como continua 1D array, p = matrix[0] le dará la 1ª columna de la 1ª vta. A continuación, el 1D array se puede acceder como p[i], *(p+i), o p[current_raw * raw_size + current_column).

    La cosa se pone complicada si una matriz 2D es representado con **p como se interpreta como una matriz de punteros a 1D matrices.

Dejar respuesta

Please enter your comment!
Please enter your name here