Concetti Chiave
- La funzione
funz()
legge una stringa, la alloca nello heap e restituisce un puntatore che rimane valido dopo l'uscita dalla funzione. - Un puntatore di puntatore può mantenere l'indirizzo di una variabile puntatore, permettendo l'accesso indiretto a un valore memorizzato.
- Un errore comune è usare un puntatore senza allocare memoria per esso, come mostrato nell'esempio con la variabile
*p
. - I vettori di puntatori offrono un miglior sfruttamento della memoria, ma mantengono spazio per il vettore stesso, come illustrato con i nomi dei mesi.
- La memoria occupata da un vettore di stringhe può essere analizzata con
sizeof
estrlen
, evidenziando la differenza tra l'intero vettore e le singole stringhe.
char * funz ()
{
char str[80];
char * p;
gets(str);
p=new char [strlen(str)+1];
strcpy(p,str);
return p;
}int main()
{
char *p;
p=funz();
…..
delete [] p;
}
Un puntatore di puntatore è una variabile abilitata a mantenere l’indirizzo di una variabile puntatore.
int **ppi;
int a = 3;
int *pi;
pi = &a;
ppi = π
printf(“%d”,**ppi);
Puntatori
L-value: è l’indirizzo di memoria di un elemento
R-value: è il valore memorizzato all’L-value.
Un errore frequente
int main()
{
int x, *p;
x = 10;
*p = x; //NO: non ho allocato l’area!!!
}
char * mesi[12]; //vettore di puntatori
Allocazione dinamica delle stringhe contenenti i mesi.
char mese[10];
int i;
for(i=0; i
{
gets(mese);
*(mesi+i)= new char[strlen(mese)+1]; // = mesi[ i ] = …..
strcpy(*(mesi+i),mese);
}
for(i=0; i
printf("%s\n",mesi);
Vantaggio: miglior sfruttamento della memoria , ho però lo spazio occupato dal vettore di puntatori.
N.B. char **punt=mesi;
Spazio di memoria occupato
char * mesi[] ={ "Gennaio","Febbraio","Marzo","Aprile","Maggio",
"Giugno","Luglio","Agosto","Settembre","Ottobre",
"Novembre","Dicembre"}; //solo in fase di inizializzazione
printf("%d\n",sizeof(mesi)); //48 byte
printf("%d\n",sizeof(mesi[2])); //4 byte
printf("%d\n",sizeof(*mesi[2])); //1 byte
printf("%d\n",strlen(mesi[2])); //5 byte