2012-09-14 28 views
7
      |--------|  
//     /|4 4 4 |  
//     |--------| 4 | 
//    /|3 3 3 | 4 | 
//    |---------|3 | | 
//   /| 2 2 2 |3 |/
//   |---------|2 |__| 
//   | 1 1 1 |2 |/
//   | 1 1 1 |__| 
//   | 1 1 1 |/
//   |_________| 
double arr[4][3][3] = {{1,1,1,1,1,1,1,1,1},{2,2,2,2,2,2,2,2,2},{3,3,3,3,3,3,3,3,3},{4,4,4,4,4,4,4,4,4}}; 

considero que esta matriz se compone de 4 capas.recorrer a través de capas de matriz utilizando puntero a la capa de la matriz de

Quiero crear el puntero a la capa de la matriz y recorrer las capas de esa matriz usando el puntero.

Trato:

double (*pp1)[sizeof(arr[0])/sizeof(ar[0][0][0])]; 
pp1 = arr[0]; 

y obtener el error de intelisense: valor de tipo (doble (*) (3) `t estar asignado al doble (*) (9)

+0

En una suposición rápida, quiere 'double (* pp1) [sizeof (arr [0])/sizeof (ar [0] [0])];' – BoBTFish

+0

También 'int! = Double'. – BoBTFish

+0

necesito sizeof (arr [0])/sizeof (ar [0] [0] [0] que es 9 (número de elementos en la capa). Cambié int en el doble, era typo –

Respuesta

0

al tratar de averiguar esta cuestión me dieron algunos resultados.

me entero de que las siguientes afirmaciones plantea ningún error de compilador

double arr[4][4][9]; 
double (*pp3)[9]; 
pp3 = arr[0]; 

Entonces, ¿es correcto deducir del código anterior que el puntero se puede asignar a la matriz solo en caso de que el número de elementos a los que apunta sea igual a la dimensión más pequeña de la matriz?

actualización: Creo que el puntero se puede crear en la capa más pequeña de la matriz solamente.

¿Alguien puede explicar esto?

+2

[Esta respuesta] (http://stackoverflow.com/a/12385772/968261) puede ayudar. –

+0

@Alexey Frunze- sí, muchas gracias por la buena fuente de información. Ahora entiendo cómo usar los punteros en las matrices, lo que se explica con bastante claridad en la respuesta que me dieron. –

0

¿Por qué no simplemente obtener la dirección del primer elemento de una capa determinada?

double *pp1 = &ar[0][0][0]; 
double *pp2 = &ar[1][0][0]; 
/* and so on */ 
+0

¿Cómo esta solución me ayudará a descubrir cómo funcionan los punteros a la capa de matriz? –

1

Así que si lo hace:

int i; 
double arr[4][3][3] = {{1,1,1,1,1,1,1,1,1},{2,2,2,2,2,2,2,2,2}, 
         {3,3,3,3,3,3,3,3,3},{4,4,4,4,4,4,4,4,4}}; 

double (*pp3)[3][3];  
pp3 = arr;  
for (i = 0; i <= 3; i++)  
{ printf("pp3 + %d is %f \n", i, ***(pp3 + i)); 
} 

A continuación presentamos lo mejor comportamiento deseado. El problema con su código es que, tal como el compilador le está diciendo, está tratando de asignar un puntero a una matriz de 9 dobles (double (*pp1)[sizeof(arr[0]/sizeof(arr[0][0][0])] evalúa a double (*pp1)[9]), pero necesita un puntero a una matriz de 3 de matriz de 3 , que es lo que declaraste con double arr[4][3][3]. De mis pruebas, gcc aceptará el double (*pp1)[9] con una advertencia de compilación, que es lo que traté de obtener en mi comentario a continuación. Espero que eso aclare las cosas.

Si desea mantener este general, entonces lo que realmente quiere es double (*pp3)[sizeof(arr[0])/sizeof(arr[0][0])][sizeof(arr[0][0])/sizeof(arr[0][0][0])], que es una maldita pesadilla.

EDITAR: Olvidé una referencia ... Debería haber copiado/pegado jaja. También se agregó una explicación sobre el comportamiento del código de la pregunta. Solucionado según los comentarios.

+0

Pensándolo bien, es apropiado hacer '(* pp3) [3] [3]', que es un puntero a una matriz de 3 de una matriz de 3, que es lo que tienes. El original (usando '(* pp3) [9]') funciona, pero como realmente no tenemos una matriz de 9, creo que de ahí proviene el error ... – surfreak

+0

Si desea mantener este general, entonces lo que realmente quieres es 'double (* pp3) [sizeof (arr [0])/sizeof (arr [0] [0])] [sizeof (arr [0] [0])/sizeof (arr [0] [0] [0])] ', que es una maldita pesadilla. Tengo que estar de acuerdo con el uso de estructuras de datos adecuadas ... pero esto hará lo que le pediste, correctamente. Añadiré esto a la respuesta. – surfreak

+0

double (* pp3) [3] [3]; pp3 = arr [0]; no compilar para compilar el código, tiene que declarar el puntero como: double (* pp3) [3] - porque arr [0] es un puntero al primer elemento de arr, que tiene dimensiones [3] [3], mientras declara el puntero este elemento, también apunta al primer elemento de la matriz [3] [3], que es (* pp3) [3]. Alexey Frunze dio una referencia sobre la explicación muy detallada del uso de los punteros a las matrices, aquí está http://stackoverflow.com/a/12385772/968261 –