Puntatori

di il
6 risposte

Puntatori

Buongiorno a tutti programmatori!!
Avrei un paio di domande da porvi:

1) Qual'è la differenza tra questi due:
int **aa [10];
Int *aaa [10];
Potreste spiegarmi cosa cambia ?

2) seconda domanda... facciamo che ho un vettore (a [5]) con dei numeri a caso.. se volessi stampare la posizione a [3]; ci sono due metodi che conosco:
cout <<a [3]; // non mi interessa così...
Oppure con i puntatori: cout <<*(a + 3);
Io vorrei stampare di una matrice la posizione aa [3][4];
Questa matrice prima l'ho riempita di numeri ma non riesco a stampare quella posizione attraverso i puntatori..
Potete aiutarmi??
Grazie mille!!!

6 Risposte

  • Re: Puntatori

    TommasoF ha scritto:


    1)
    Il primo è un vettore di puntatori a puntatori ad interi, il secondo è un vettore di puntatori ad interi.
    2)
    Ma la matrice come è stata dichiarata?
  • Re: Puntatori

    Grazie mille per le due risposte..
    Con la matrice sto provando a tentativi..
    Prima:
    Int a [10][10];
    int *a [ecc..]
    Int **a [exc..]

    Però non capisco..

    Inoltre se io faccio:
    
    Cout <<matrice; //mi stampa l'indirizzo della posizione [0][0].
    
    Cout <<matrice+1; // mi stampa un altro indirizzo ma di 28 byte dopo.. come mai ??
    Se io invece utilizzavo il vettore..
    cout <<vett; // stampava l'indirizzo del vettore in posizione 0
    
    
    Cout <<vett + 1; // QUESTO mi stampa l'indirizzo del vett [1].. in questo caso, invece, ci sono 4 byte di più rispetto a quello precedente  (questo mi sembra sia così perché il vettore è int, un int è 4 byte e perciò l'indirizzo cambia di 4 byte.
    Però, allora, come mai con la matrice ne fa 28??
    Grazie
  • Re: Puntatori

    Per la matrice 10 x 10 devi scrivere

    *((int *)aa + 3 * 10 + 4)

    per ottenere l'elemento [3][4]
  • Re: Puntatori

    oregon ha scritto:


    Per la matrice 10 x 10 devi scrivere

    *((int *)aa + 3 * 10 + 4)

    per ottenere l'elemento [3][4]
    Ottimo.. ma sapresti anche dirmi perché devo fare 3*10?
    Poi.. come mai devo fare un casting ? Trasformo l'indirizzo in numero??
    Ultima cosa.. se fosse un vettore a 3 dimensioni e volessi stampare la posizione [3][4][5].
    *((int*)aa + 3*10 + 4*10 + 5)
    giusto??
    Ah.. ultima domanda davvero.. come mai se mettevo
     cout <<aa+1; 
    mi stampava l'indirizzo con 28 byte di differenza rispetto a quello precedente??

    Grazie mille !!!!
  • Re: Puntatori

    TommasoF ha scritto:


    Ottimo.. ma sapresti anche dirmi perché devo fare 3*10?
    Pensavo l'avessi capito ...

    Gli array sono organizzati in memoria come vettori ...
    Poi.. come mai devo fare un casting ?
    Devi indicare al compilatore che il nome non deve essere inteso come puntatore ad un array ma come puntatore ad un vettore equivalente (in modo che il compilatore possa fare i calcoli correttamente). Lui, internamente, lo fa, ma tu glielo devi dire.
    se fosse un vettore a 3 dimensioni
    No ... il primo indice va moltiplicato per 100
    *((int*)aa + 3*100 + 4*10 + 5)
    ultima domanda
    28 esadecimale = 40 byte ... indovina perché
  • Re: Puntatori

    28 esadecimale = 40 byte.. essendo una matrice [10][10]
    se faccio matrice +1.. fa 40 byte perché fa 10 posti.. giusto?? 10×4=40.
Devi accedere o registrarti per scrivere nel forum
6 risposte