nikpez
Ominide
1 min. di lettura
Vota 5 / 5

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 e strlen, evidenziando la differenza tra l'intero vettore e le singole stringhe.
Allocazione dinamica - Funzioni

Esercizio
Scrivi una funzione che legga una stringa, la allochi nello HEAP e faccia in modo che essa sia ancora disponibile al termine della funzione.

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

Vettori di puntatori

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

Domande e risposte

Hai bisogno di aiuto?
Chiedi alla community