Newsgroup: it.comp.lang.c
Titolo: Sono un programmatore alle prime armi

Ciao a tutti.
Sono uno studente al primo anno d'Informatca e avrei bisogno di una
delucidazione. Devo preparare un esame sul Linguaggio C e mi sono accorto
che una parte saliente in questo linguaggio la fanno i puntatori. Non riesco
però a vederne l'utilità, ossia quando programmo non so che farmene.
Mi potreste spiegare molto semplicemente i vantaggi che mi danno i puntatori
facendomi esempi molto semplici?
Vi ringrazio
                                                                    DottRoss


I puntatori inutili??? Come osi? :-)
I puntatori sono supportati nella maggior parte dei linguaggio di livello
medio basso che hanno fatto la storia dell'informatica, quindi un motivo ci
deve pure essere. L'attuale sviluppo dell'informatica e dei nuovi linguaggi
tendenti sempre più verso la programmazione ad oggetti (dove l'interazione
diretta con la macchina viene "mascherata" da possenti strati di software
più vicini alla comune logica umana) sta tendendo ad eliminare simili
elementi, ma non per la loro inutilità, più che altro per questioni di
controllo e sicurezza.
I puntatori sono delle strutture che permettono di accedere alla memoria in
modo INDIRETTO. Come sai, ogni byte in memoria può essere individuato
tramite il suo indirizzo. Per esempio, posso leggere il contenuto del byte
all'indirizzo 0x000001 per esempio:
a = *( (char *) 0x000001)
Ma in questo modo, l'indirizzo deve essere sempre quello! Nel senso che se
voglio accedere ai seguenti 5 byte, dovrei scrivere:
a = *( (char *) 0x000001)
b = *( (char *) 0x000002)
c = *( (char *) 0x000003)
d = *( (char *) 0x000004)
e = *( (char *) 0x000005)
Cosa sicuramente scomoda e restrittiva nalla maggior parte dei casi.
I puntatori invece, permettono di lavorare con gli indirizzi in modo
semplice e "dinamico". Per esempio, posso mettere in una variabile puntatore
l'indirizzo 0x000001 e incrementarlo successivamente in modo da coprire la
zona di memoria che mi interessa con un semplice ciclo iterativo.
a = (char *) 0x000001;
for (count = 0; count <5; count ++)
{
    b = *a;
    a = a + 1;  // Incremento
    StoreValue(b); // supponiamo di conservare il valore letto in un buffer
tramite una funzione apposita indeterminata
}
Lo stesso poteva farsi considerando *a un array, sono praticamente la stessa
cosa eccetto che gli array hanno bisogno di un indice (o 2 nel caso siano
bidimensionali, in questo caso si tratta di doppi puntatori).
c = 0;
for (count = 0; count <5; count ++)
{
    b = a[c];
    c = c + 1;  // Incremento
    StoreValue(b); // supponiamo di conservare il valore letto in un buffer
tramite una funzione apposita indeterminata
}
Questo è solo uno dei tanti possibili casi, ma già dalle implicazioni di
queste poche righe di codice, possono nascere grossi vantaggi, specie quando
si lavora a livello di strutture di memoria piuttosto che con semplici
buffer di byte consecutivi.
I puntatori rendono possibile la realizzazione in modo semplice di strutture
anche dinamiche quali liste, code, alberi o grafi.
Prendi l'esempio delle liste. La lista è un insieme di elementi detti NODI,
ogni nodo punta (cioè indica dove si trova nella memoria) il successivo.
Ecco la struttura di un nodo:
typedef struct _nodo
{
    int value; // Valore effettivo
    struct nodo *successivo;
} nodo;
ogni puntatore viene definito tramite il simbolo * prima del nome della
variabile che intendi definire.
In questo modo, definita una "testa" della coda, possiamo realizzare una
struttura del tipo:
Testa ---+ (successivo)
              |
Nodo1 -+ (successivo)
              |
Nodo1 -+ (successivo)
              |
Nodo1 -+ (successivo)
              |
.........---+
Le liste realizzate tramite puntatori risultano più comode e flessibili
degli array, dato che essendo gli elementi semplicemente concatenati tramite
puntatori, e non effettivamente prossimi l'uno accanto all'altro è possibile
eliminare elementi intermedi o inserirne nuovi intervenendo solo sui
puntatori dei vari nodi che si trovano accanto.
Era solo un esempio, le applicazioni e le ottimizzazioni che sono attuabili
tramite i puntatori sono praticamente infinite. Ovviamente se sei abituato a
programmare in linguaggi ad alto livello di interazione con l'utente (come
basic), ti suoneranno strani o poco familiari, ma nei linguaggi di livello
medio basso (gli stessi utilizzati per la programmazione dei sistemi
operativi) accedere alla memoria è quasi sempre una via d'obbligo, ed
abituarsi a pensare "a puntatori" può mostrarsi estremamente utile. Se ci
pensi bene, ci sono delle cose che senza puntatori risulterebbero scomode, o
addirittura poco attuabili.
Spero di avere soddisfatto la tua curiosità.
Ciao
ps: Convertiti ai puntatori!!! :PPP
pps: perchè no? Un pezzo di carta contenente il tuo indirizzo di casa
potrebbe essere considerato un puntatore a casa tua! :D semplice, no?

scusate l'ortografia ma andavo di fretta, bye

 facendomi esempi molto semplici?
Servono più che altro per l'allocazione dinamica della memoria e per il
passaggio di oggetti per indirizzo.
EMG

 però a vederne l'utilità, ossia quando programmo non so che farmene.
Non per essere maleducato, ma dopo questa tua brillante deduzione, non hai
pensato di dare un'occhiata al libro di testo del corso di programmazione,
soprattutto dove si parla delle varie strutture dati (alberi, code, pile,
ecc...)? No, non ci hai pensato? Male!
-- 
 Ciao, Bianco.
 Reply to luca.bianco (at) 
tiscalinet.it

ps: Convertiti ai puntatori!!! :PPP
sul fatto che i puntatori siano indispensabili nessun dubbio. Perň una
raccomandazione: usali il meno possibile!
Anto
--
Antonio Cuni, 19 anni, studente
Brainbench Certification: 
Master C++: 4.6, higher than 98% of all previous test takers.
C Language: 3.32, higher than 79% of all previous test takers.
http://www.brainbench.com/transcript.jsp?pid=1301688

 
http://www.brainbench.com/transcript.jsp?pid=1301688
Con un consiglio come questo (usali il meno
possibile) ho capito perche' hai preso MENO
sul C (3.32) che sul C++ (4.6). :-)
Non dico di usarli SEMPRE.
Ma di usarli quando servono (cioe' spesso)!!!
                          Andrea Zaghi

Ma di usarli quando servono (cioe' spesso)!!!
purtroppo in C sono spesso indispensabili. Ma c'è anche chi li mette
anche dove non servono, e per un newbie è facile farsi prendere la
mano.
