Programmare in C – Perchè utilizzare i puntatori?

Alla luce di quello di cui abbiamo parlato nelle precedenti lezioni, vediamo perchè utilizzare i puntatori in linguaggio C.

Immaginate di voler creare un editor di testo – un programma che vi permetta di editare file di testo in formato ASCII, proprio come i noti programmi “vi” su UNIX oppure “Notepad” su Windows. Un text editor è la cosa che può essere creata alla portata di tutti, poiché ogni programmatore è avvezzo ad utilizzare un editor di testo essendo esso la base per scrivere un qualsiasi programma software. Si può vedere l'editor di testo come il collegamento fra il programmatore e il computer. Poiché il text editor è così importante, vi sono programmatori che creano il loro proprio editor e lo personalizzando per meglio adattarlo alle proprie esigenze e modalità di lavoro.

Così, anche voi un giorno vi siederete davanti al vostro computer e inizierete a lavorare sul vostro editor. Dopo aver pensato a tutte le caratteristiche che volete che abbia, inizierete di certo a pensare alla struttura dati per il vostro editor. In altre parole, inizierete a pensare dove memorizzerete i documenti che state editando e come manipolarli/modificarli/gestirli nel programma.

Quindi, vi accorgerete che avrete bisogno di un modo intelligente di memorizzare le informazioni e i dati che state editando, in modo che qualsiasi operazione su di essi possa essere svolta rapidamente e facilmente. Penserete che un modo per fare ciò sia organizzare i dati come linee di caratteri. Alla luce di quello di cui abbiamo parlato nelle precedenti lezioni, l'unica cosa a vostra disposizione è un array.

Penserete quindi: “Bene, la classica linea degli editor di testo contiene 80 caratteri e un file non conterrà più di 1000 linee”.
Detto ciò, potrete dichiarare un array bi-dimensionale come questo:

char doc[1000][80];

Questa dichiarazione prevede l'uso di un array di 80000 caratteri (80 caratteri x 1000 linee).

Ma se poi vi soffermate a pensare al vostro editor e alla sua struttura dati , vi accorgerete che:
• alcuni documenti possono essere solo degli elenchi, in cui ogni singola linea è corta ma vi sono migliaia e migliaia di linee
• alcuni altri file al contrario potrebbero avere linee più lunghe di 80 caratteri. Ad esempio, certi file dati potrebbero contenere anche 542 caratteri, dove ogni carattere rappresenta le coppie di amminoacidi di un segmento di DNA. Si tratta sicuramente di file “eccezionali” ma bisogna tener conto di tutte le possibilità per avere un text editor funzionante in qualsiasi situazione.
• Nella maggior parte degli editor, si possono aprire (e lavorare) su più file contemporaneamente.

Diciamo pertanto che potremmo impotare un numero massimo di 10 file aperti, una lunghezza di linea massima di 1000 caratteri e una dimensione massima di 50000 linee, per cui dovremmo cambiare la dichiarazione di cui sopra, così come segue:

char doc[50000][1000][10]

Capirete da soli che questa non è una cosa ragionevole: provate a moltiplicare 50000 per 1000 e poi ancora per 10. L'array conterrebbe 500 milioni di caratteri e potrebbero verificarsi dei problemi per memoria insufficiente. Anche se la maggior parte dei computer moderni potrebbe ospitare in memoria un array così grande, non è intelligente occupare tutta la RAM a disposizione o addirittura andare ad utilizzare anche lo spazio di memoria virtuale. Cosa succederebbe se faceste partire il programma del vostro text editor più di una volta, oppure se più utenti in un sistema multi-user lanciassero allo stesso tempo il vostro editor?

E' chiaro che facendo così avremmo uno spreco di spazio notevole: è strano dichiarare di dover usare un array di 500 milioni di caratteri quando nella maggior parte dei casi lavoreremo su file di 100 linee che costeranno in termini di memoria 4000/5000 bytes.

Il problema insito nel lavorare con gli array è quello di dover dichiarare a priori la dimensione massima che questo occuperà. Quindi, nel nostro text editor, di fatto non siamo in grado di dire né la lunghezza massima di una linea di testo né quante linee avrà il nostro file. Potenzialmente entrambi i parametri sono “infiniti”.

I puntatori sono stati specificatamente pensati per risolvere questo problema. Con i puntatori si possono creare strutture dati dinamiche. Invece di impostare le strutture dati con lo spazio occupato nel caso peggiore possibile, con i puntatori si alloca memoria nello spazio heap man mano che serve, mentre il programma è in esecuzione. In questo modo si utilizza la quantità di memoria esatta, senza sprechi. Inoltre, quando un documento viene chiuso, si può pertanto liberare la memoria heap occupata in modo che possa essere riutilizzata se necessario. Con i puntatori, infatti, la memoria può essere riutilizzata mentre il programma è in esecuzione.

Scarica subito una copia gratis

Scrivi un commento

Seguici anche sul tuo Social Network preferito!

Send this to a friend