2012-09-14 8 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}}; 

ritengo che questa matrice è costituito da 4 strati .Traverse attraverso strati di array usando puntatore strato di matrice

Voglio creare il puntatore al livello dell'array e attraversare i livelli di tale array utilizzando il puntatore.

cerco:

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

e ottenere errore dal intelIsense: valore di tipo (doppia (*) (3) può `t essere assegnati a raddoppiare (*) (9)

+0

A una rapida ipotesi, si desidera 'double (* pp1) [sizeof (arr [0])/sizeof (ar [0] [0])];' – BoBTFish

+0

Anche 'int! = Double'. – BoBTFish

+0

ho bisogno di sizeof (arr [0])/sizeof (ar [0] [0] [0] che è 9 (numero di elementi nel layer). Ho cambiato int su double, è stato typo –

risposta

0

Mentre si cerca di capire questo problema ho ottenuto alcuni risultati.

scopro che le seguenti affermazioni non solleva errori dal compilatore

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

Quindi, è corretto dedurre dal codice precedente che il puntatore può essere assegnato all'array solo nel caso in cui il numero di elementi a cui punta sia pari alla dimensione più piccola dell'array?

aggiornamento: Penso che il puntatore può essere creato solo sul più piccolo livello di matrice.

Qualcuno può spiegarlo?

+2

[Questa risposta] (http://stackoverflow.com/a/12385772/968261) può aiutare. –

+0

@Alexey Frunze- sì, grazie mille per la buona fonte di informazioni. Ora capisco come usare i puntatori sugli array, che è abbastanza chiaramente spiegato nella risposta che mi hai dato. –

0

Perché non ottenere semplicemente la direzione del primo elemento di un determinato livello?

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

In che modo questa soluzione mi aiuterà a capire come funzionano i puntatori allo strato di array? –

1

Quindi, se si fa:

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)); 
} 

Quindi si ottiene il comportamento desiderato. Il problema con il tuo codice è che, proprio come ti sta dicendo il compilatore, stai provando ad assegnare un puntatore a un array di 9 double (double (*pp1)[sizeof(arr[0]/sizeof(arr[0][0][0])] valuta a double (*pp1)[9]), ma hai bisogno di un puntatore a un array di 3 di array di 3 , che è quello che hai dichiarato con double arr[4][3][3]. Dai miei test, gcc accetterà lo double (*pp1)[9] con un avviso del compilatore, che è quello che ho cercato di ottenere nel mio commento qui sotto. Spero che chiarisca le cose.

Se si desidera mantenere questo generale, quindi quello che vuoi veramente è double (*pp3)[sizeof(arr[0])/sizeof(arr[0][0])][sizeof(arr[0][0])/sizeof(arr[0][0][0])], che è un maledetto incubo.

EDIT: Ha dimenticato un dereferenziamento ... Avrebbe dovuto copiare/incollare haha. Aggiunta anche una spiegazione sul comportamento del codice della domanda. Risolto come da commenti.

+0

A pensarci bene, è corretto fare '(* pp3) [3] [3]', che è un puntatore a un array di 3 di matrice di 3, che è quello che hai. L'originale (usando '(* pp3) [9]') funziona, ma dal momento che non abbiamo un array di 9, credo che sia da lì che arriva l'errore ... – surfreak

+0

Se vuoi mantenere questo generale, allora quello che vuoi veramente è 'double (* pp3) [sizeof (arr [0])/sizeof (arr [0] [0])] [sizeof (arr [0] [0])/sizeof (arr [0] [0] [0])] ', che è un maledetto incubo. Devi essere d'accordo con l'utilizzo di strutture dati adeguate ... ma questo farà ciò che hai chiesto, correttamente. Lo aggiungerò alla risposta. – surfreak

+0

double (* pp3) [3] [3]; pp3 = arr [0]; wan't compile. per compilare il codice è necessario dichiarare il puntatore come: double (* pp3) [3] - perché arr [0] è puntatore al primo elemento di arr, che ha dimensioni [3] [3], come si dichiara puntatore su questo elemento, è anche il primo elemento della matrice [3] [3], che è (* pp3) [3]. Alexey Frunze ha dato un riferimento sulla spiegazione molto dettagliata dell'uso dei puntatori agli array, qui è http://stackoverflow.com/a/12385772/968261 –

Problemi correlati