Array tre dimensioni puntatori

di Anonimizzato15813 il
7 risposte
Ciao a tutti, stavo tentando di svolgere un esercizio sfruttando la correlazione tra puntatori e array, quindi utilizzando
l'arimetica dei puntatori volevo leggere l'indirizzo di ogni cella di memoria in un array a tre dimensioni.. questo è il
codice che funziona, ma che utilizza l'indicizzazione dell'array:
#include <iostream>

using namespace std;

int main()
{
    int punt [3][4][2]{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17};
    int a,b,c,*p;

    p=&(punt[0][0][0]);// ciò significa che p=punt[0][0][0]

    for(a=0;a<=2;a++){
        for(b=0;b<=3;b++){
            for(c=0;c<=1;c++){
                cout << &(punt[a][b][c]) << "\n";
            }
        }
    }
}
è possibile fare la stessa cosa anche utilizzando il puntatore p? io pensavo si potesse fare cosi:

#include <iostream>

using namespace std;

int main()
{
    int punt [3][4][2]{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17};
    int a,b,c,*p;

    p=&(punt[0][0][0]);// ciò significa che p=punt[0][0][0]

    for(a=0;a<=2;a++){
        for(b=0;b<=3;b++){
            for(c=0;c<=1;c++){
                cout <<p+a+b+c << "\n";
            }
        }
    }
}
ma ho visto che non funziona.. esiste una soluzione?

7 Risposte

  • I valori sono organizzati come in un vettore ... per vedere come sono organizzati ti basta incrementare il puntatore
    
         p = (int *)punt;
    
        for(a=0; x<3*4*2; x++, p++)
           cout << *p << " ";
    
  • Ho provato con il tuo consiglio con questo codice :
    #include <iostream>
    
    using namespace std;
    
    int main()
    {
        int punt [3][4][2]{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17};
        int a,x,*p;
    
         p = (int *)punt;
    
        for(a=0; x<3*4*2; x++, p++)
           cout << *p << "\n";
    }
    
    Ma non funziona... e in ogni caso riusciresti a spiegarmi a cosa serve il codice che mi ho postato sopra? perche non riesco a capire come funziona..
    Grazie mille comunque e scusami per la mia ignoranza
  • 
    #include <iostream>
    
    using namespace std;
    
    int main() {
        int punt [3][4][2] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24};
        int x,*p;
    
        p = (int *)punt;
        /*  p = &punt[0][0][0]; */ /*  p = (int *)punt; */ /* Sono espressioni equivaleni */
    
        for(x=0 ; x<3*4*2; x++, p++)
            cout << *p << " ";
        cout << "\n";
    }
    
    In realtà il vettore multidimensionale è pur sempre un vettore, oregon voleva farti vedere questo, se esegui il programma sopra di renderai conto che così facendo scandisci tutto il vettore ma incrementando li puntatore.
  • Da un altro punto di vista, puoi usare i 3 indici con il puntatore per ottenere i valori
    
    	p = (int *)punt;
    
    	for(a=0;a<3;a++) {
    			for(b=0;b<4;b++) {
    				for(c=0;c<2;c++) {
    					cout << *(p + a*8 + b*2 + c) << "\n";
    				}
    			}
    		}
    
    Probabilmente però non puoi ancora affrontare questi problemi perché non hai ancora chiarissimo l'uso dei puntatori. Parti da cose più semplici.
  • Grazie per la risposta Oregon, come da te ipotizzato non riesco a capire l'algoritmo all'interno dei for forse perchè dovrei prima approfondire meglio l'argomento dei puntatori.. In ogni caso riusciresti ad accennarmi di cosa si tratta e come funziona approssimativamente?
    Grazie ancora
  • La prima cosa di cui ti devi rendere conto è questa ... La memoria di un computer è lineare, i dati sono memorizzati in sequenza, indirizzo dopo indirizzo ...

    Quindi, nel semplice caso di un array ad una dimensione non ci sono problemi, ma già per un array di tipo quadrato 3x3 secondo te come sono memorizzati i dati in memoria?
  • Forse ho capito... Praticamente dato che i dati sono memorizzati in modo lineare ho pensato che l'algoritmo da te inserito
    praticamente contasse anche le posizioni che non sono state contate.. non so se mi sono spiegato..
    Praticamente nell'array punt[a][c] quando c si "esaurisce" e quindi si incrementa b, il fatto che si metta b*2 sta a significare che si contano anche le posizioni
    che ha occupato fino a quel momento c... lo stesso discorso lo fa anche a, solo che in questo caso bisogna moltiplicare 4*2
    che sono le dimensioni di b e c... Il ragionamento è giusto Oregon?
Devi accedere o registrarti per scrivere nel forum
7 risposte