1)tipico esempio di lista è una rubrica
il cui numero di utenti memorizzati
cambia diminuendo(cancellazione)o
aumentando(inserzione)
Quindi la "base dati" non puo' essere "statica"
ovvero fissata all'atto della stesura del
programma,ma "varia" durante l'esecuzione
del programma(inserisco,cancello)siamo
cioè in presenza di un fenomeno "dinamico"
(il numero di utenti della rubrica cambia)
da cui la dizione "Allocazione Dinamica"
2)le variabili "statiche" sono referenziate
tramite il loro "identificatore" o nome
simbolico(int numero;numero:identificatore)
questo meccanismo ci permette di evitare
di lavorare sulle locazioni di memoria,
il compilatore riserva uno spazio di memoria
di dimensione pari al "tipo"(int 4 byte,char 1 byte)
a cui noi (inconsapevoli)acccediamo tramite il suo
identificatore,fregandocene della reale tecnica
di gestione della memoria.
Ma qualunque oggetto che risiede in memoria
deve avere un indirizzo di memoria,nel caso
statico il meccanimo dell'identificatore
ci permette di poter fare ameno della conoscenza
dell'indirizzo,se si vuole conoscere si procede cosi':
int a;
int *pI=a;
a=2;
printf("%p,%Fp\n",pI,pI);
/*stampo l'indirizzo di a*/
Nel caso "dinamico",non esiste l'identificatore
in quanto le variabili dinamiche vengono allocate
durante l'esecuzione del programma,che facciamo?
Usiamo l'altro metodo(l'unico possibile)
ovvero i puntatori,che sostituiscono l'identificatore.
esempio
char *p;
if(p=(char*)malloc(sizeof(char)))==NULL)
perror("malloc");
/*con questa istruzione creo una variabile dinamica*/
/*il cui identificatore è il puntatore p*/
/*quindi se ci voglio scrivere dentro qualcosa*/
*p='l';
Le liste sono un insieme di variabili dinamiche
legate tra loro tramite puntatori
esempio di lista
/******************************************/
/* lista per rubrica */
/******************************************/
typedef struct user
{
char nome[30];
char cognome[30];
struct user *successivo;/*puntatore che lega le variabili dinamiche*/
}Utente;

/*creo la lista*/
Utente *Phead=NULL;
Utente *Pcorr=NULL;
Utente Aux;
char car;
printf("Iserisci i dati per gli utenti\n");
while(car!='n')
{
printf("NOME: ");
scanf("%s",Aux.nome);
printf("COGNOME: ");
scanf("%s",Aux.cognome);
/*creo la prima variabile dinamica*/
if((Pcorr=(Utente*)malloc(sizeof(Utente)))==NULL)
{
perror("malloc()");
return -1;
}
/*riempio i suoi campi*/
(*Pcorr)=Aux;
/*faccio il collegamento*/
Pcorr->successivo=Phead;
Phead=Pcorr;
printf("finire?[y/n]\n");
scanf("%c",&car);
}
free(Phead);
/*in tal modo possiamo inserire quanti utenti vogliamo*/
/*senza che sia stata fissata la dimensione delle */
/*struct da usare*/