Array e algebra dei puntatori Array e algebra dei puntatori char string[16]; string[0] A tempo di esecuzione 16 caratteri verranno allocati in memoria per questo array. Poiché un carattere è rappresentato con 1 byte, verranno allocati 16 indirizzi di memoria susseguenti string[15] Ma cosa è string? Noi lo usiamo ad esempio in cout << string Array e algebra dei puntatori • Il valore della variabile string (senza [i]) è l’indirizzo in memoria della prima locazione assegnata al vettore. Per questo viene detto un puntatore a quella locazione. string=ff00 Array e algebra dei puntatori • E’ string + i? • In generale corrisponde all’indirizzo – string+ i tb – Dove tb il numero di byte del tipo base dell’array • Nel nostro caso è un array di caratteri quindi tb=1 string=ff00 string+5=ff05 Notate che string[5]= (string+5)[0] Questo vale in generale, ovvero per qualunque tipo base di un array Array e algebra dei puntatori int vett[4]; A tempo di esecuzione verranno allocati in memoria 4 interi susseguenti. Ma un intero è formato da 4 byte, quindi verranno allocati 16 indirizzi di memoria susseguenti vett[0] vett=f600 vett[1] vett+1=f604 vett[2] vett+2=f608 vett[3] vett+3=f612 Matrici e algebra dei puntatori • Cosa succede con le matrici? • char matr[4][4] • Notate che viene allocata in sequenza la stessa quantità di memoria di vett[4] riga 0 Valore: matr[0][0] Indirizzo: matr=f600 riga 1 matr[1][0] riga 2 matr[2][0] matr+4*1=f604 matr+4*2=f608 riga 3 matr[3][2] matr+4*3+2=f614 Matrici e algebra dei puntatori • In generale data una matrice – <tipo> matr[DIMR] [DIMC] • Quale indirizzo corrisponde all’elemento – matr[n][m]? • Viceversa quale elemento della matrice corrisponde all’indirizzo – matr + c ? • Questo lo dovete capire svolgendo gli esercizi Deferenziazione • Chiaramente una cosa è il valore di una locazione, altra è il suo indirizzo: matr[1][0]≠matr+4 • Per ottenere il valore di una locazione a partire dal suo indirizzo si utilizza l’operatore di deferenziazione: matr[1][0]=(matr+4)* • Nota che il valore dipende dal tipo base: (matr+4)* (vett+1)* Referenziazione • L’operazione inversa è quella della referenziazione: – &(vett[2]) = vett+2 – &(matr[1][1]) = matr+5 • Notate che – – – – &(vett[0]) e vett sono dello stesso tipo: int * &(matr[0][0]) e matr non sono dello stesso tipo &(matr[0][0]) è char * (perché matr[0][0] è un char) matr è un char[*][4] (ovvero è un puntatore ad array di 4 caratteri che corrisponde ad una riga) Dichiarare puntatori #include <iostream> using namespace std; #define DIM 3 void inizializza_matrice(int* matr, int dim); void stampa_matrice(int * matr, int dim); int main(){ int a[DIM][DIM]; int *matr=&(a[0][0]); inizializza_matrice(matr,DIM); stampa_matrice(matr,DIM); return 0; }
© Copyright 2025 ExpyDoc