Array e algebra dei puntatori

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