Array tre dimensioni puntatori

di il
7 risposte

Array tre dimensioni puntatori

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

  • Re: Array tre dimensioni puntatori

    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 << " ";
    
  • Re: Array tre dimensioni puntatori

    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
  • Re: Array tre dimensioni puntatori

    
    #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.
  • Re: Array tre dimensioni puntatori

    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.
  • Re: Array tre dimensioni puntatori

    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
  • Re: Array tre dimensioni puntatori

    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?
  • Re: Array tre dimensioni puntatori

    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