PDA

Visualizza la versione completa : [C++] Puntatori: come possono essere utilizzati e a cosa servono


P4nico
07-03-2007, 02:10
A prescindere che è 1 argomento che non ho ancora affrontato... ho iniziato a darci 1 occhiata e volevo chiedere a voi se avevato 1 modo semplice e veloce per spiegarmi come posso essere utilizzati e a cosa servono esattamente.

Allora per quello che ho capito i puntatori lavorano sull'indirizzo di variabili e non sui loro valori. Proprio per questo che si collegano molto bene ai vettori.

Ma visto che facciamo finta che debba passare l'indirizzo della prima variabile a una funzione e scrivere.

*p = &vettore[0];
funzione(*p);

è uguale a scrivere:

funzione(vettore);

non capisco in quali casi pratici, l'utilizzo di puntatori (che sono anche limitati dall'aritmetica visto che molte operazioni non sono possibili) può rivelarsi cosi utile da renderli cosi importanti .. almeno in base a quanto ne seno...

Vi ringrazio

oregon
07-03-2007, 08:37
Per fare degli esempi "non ambigui" devi sempre specificare come hai dichiarato le tue variabili e i tuoi puntatori. Se ad esempio hai scritto

char vettore[100];
char *p;

allora dovrai scrivere

p=&vettore[0];
funzione(p);

e questo sara' equivalente a

funzione(vettore);

Detto questo, i puntatori sono "essenziali" in C nel passaggio di parametri alle funzioni nel momento in cui bisogna che tali funzioni modifichino il valore di tali dati.

Probabilmente non e' possibile che tu capisca a fondo la loro importanza se non li studi ed utilizzi a fondo ....

Fra l'altro, dire che sono limitati dall'aritmetica non e' corretto e non ha neanche tanto senso. Non ha infatti alcuno scopo fare una "divisione" tra due puntatori, ma imparerai che esiste una specifica "aritmetica dei puntatori" molto utile in tanti casi.

P4nico
07-03-2007, 12:04
Si fin qui c'ero anche io... ma hai ribadito una cosa che a me non convince....

Il fatto che io possa dare l'indirizzo del primo elemento di un vettore ad un puntatore, e poi nel richiamo della funzione passo quest'ultimo, invece che il vettore stesso... cioè io l'ho vedo come del codice sprecato..... volevo capire in quale momento i puntatori sono inevitabili... cioè i vettori sono fondamentali... xke hanno la caratteristica di poter accumulare molti dati tutti in un unico vettore e fin qui ci sono... ma se i puntatori fanno delle cose, che posso essere fatte da altri, a cosa servono?? qualcuno potrebbe farmi 1 esempio concreto magari che io possa capire.

Vi ringrazio

UltraBeginner
07-03-2007, 12:30
Originariamente inviato da P4nico
Si fin qui c'ero anche io... ma hai ribadito una cosa che a me non convince....

Il fatto che io possa dare l'indirizzo del primo elemento di un vettore ad un puntatore, e poi nel richiamo della funzione passo quest'ultimo, invece che il vettore stesso... cioè io l'ho vedo come del codice sprecato..... volevo capire in quale momento i puntatori sono inevitabili... cioè i vettori sono fondamentali... xke hanno la caratteristica di poter accumulare molti dati tutti in un unico vettore e fin qui ci sono... ma se i puntatori fanno delle cose, che posso essere fatte da altri, a cosa servono?? qualcuno potrebbe farmi 1 esempio concreto magari che io possa capire.

Vi ringrazio

Bhe un esempio a naso....

al posto di dichiarare un vettore di dimensione prefissata per mettervi una stringa,come per es.

char vett[100]

potresti usare un puntatore a char

char *vett;

e con l uso di malloc allocare il giusto spazio di memoria per allocare la tua stringa.
Con malloc puoi allocare stringhe di qualsiasi dimensione (a patto di non sforare la memoria! lol)
mentre con char vett[100] non puoi "usare" stringe maggiori di 99 caratteri e inoltre se "usi" stringhe con meno di 99 caratteri sprecheresti memoria.

Al contrario invece con char *vett potresti operare in questo modo;

vett=(char *) malloc(sizeof(char)*DimesioneTuaStringa);

Questo e un esempio stupidissimo, ma spero possa tornarti utile! :)

ilmo lesto
07-03-2007, 12:50
Originariamente inviato da P4nico
Si fin qui c'ero anche io... ma hai ribadito una cosa che a me non convince....

Il fatto che io possa dare l'indirizzo del primo elemento di un vettore ad un puntatore, e poi nel richiamo della funzione passo quest'ultimo, invece che il vettore stesso... cioè io l'ho vedo come del codice sprecato..... volevo capire in quale momento i puntatori sono inevitabili... cioè i vettori sono fondamentali... xke hanno la caratteristica di poter accumulare molti dati tutti in un unico vettore e fin qui ci sono... ma se i puntatori fanno delle cose, che posso essere fatte da altri, a cosa servono?? qualcuno potrebbe farmi 1 esempio concreto magari che io possa capire.

Vi ringrazio

anch'io la pensavo così all'inizio. ma come ha detto giustamente oregon le cose non ti saranno chiare fin quando non le utilizzerai.

forse vedi il problema dalla parte sbagliata... il vettore in realtà appartiene alla famiglia dei puntatori (il nome del vettore è un puntatore che punta sempre al primo elemento del vettore stesso).

possiamo dire che: in principo Dio creò i puntatori, e in seguito creò i vettori (che sono un particolare tipo di puntatori).

P4nico
07-03-2007, 14:00
Originariamente inviato da UltraBeginner
Bhe un esempio a naso....

al posto di dichiarare un vettore di dimensione prefissata per mettervi una stringa,come per es.

char vett[100]

potresti usare un puntatore a char

char *vett;

e con l uso di malloc allocare il giusto spazio di memoria per allocare la tua stringa.
Con malloc puoi allocare stringhe di qualsiasi dimensione (a patto di non sforare la memoria! lol)
mentre con char vett[100] non puoi "usare" stringe maggiori di 99 caratteri e inoltre se "usi" stringhe con meno di 99 caratteri sprecheresti memoria.

Al contrario invece con char *vett potresti operare in questo modo;

vett=(char *) malloc(sizeof(char)*DimesioneTuaStringa);

Questo e un esempio stupidissimo, ma spero possa tornarti utile! :)

Non conosco i malloc ma vorrei capire cosa fa la tua riga di codice, allora hai detto che il puntatore è un chat e poi questa "malloc(sizeof(char)*DimesioneTuaStringa)", cosa fa esattamente... qualcuno la potrebbe leggere?
Mi spiego... Ultra è stato chiaro ma per capire meglio come in questo caso è stato usato il puntatore volevo capire esattamente la riga di comando

Grazie

P4nico
07-03-2007, 14:03
Originariamente inviato da ilmo lesto
anch'io la pensavo così all'inizio. ma come ha detto giustamente oregon le cose non ti saranno chiare fin quando non le utilizzerai.

forse vedi il problema dalla parte sbagliata... il vettore in realtà appartiene alla famiglia dei puntatori (il nome del vettore è un puntatore che punta sempre al primo elemento del vettore stesso).

possiamo dire che: in principo Dio creò i puntatori, e in seguito creò i vettori (che sono un particolare tipo di puntatori).

E allora qualcuno deve dire alle scuole di studiare prima i puntatori dei vettori :)
Cmq ribadico il fatto che la differenza di questi due è evidente nel momento in cui i vettori hanno la precisa funzione di contenere molti dati (anche se il primo indirizzo è in sè 1 puntatore), mentre il puntatore... non ha nulla in più... io posso passare a una funzione, un vettore, ed una variabile, xke dovrei passarli l'indirizzo (puntatore) di una variabile è questo che non capisco... Io fin'ora ho sempre risolto tranquillamente problemi medio bassi senza l'utilizzo di quest'ultimi... e non capisco come i puntatori potrebbero migliorare o aiutarmi a risolvere i problemi.

ilmo lesto
07-03-2007, 14:17
per esempio: se devi passare una variabile di tipo struct ad una funzione cosa accade?
se passi il nome della variabile struct, la struttura stessa verrà passata per valore, quindi all'interno della funzione si creerà una copia della variabile struct.

se invece passi un puntatore che punta alla variabile struct, passerai l'indirizzo della variabile (passaggio per riferimento) e quindi non si creerà una copia di struct.

se la tua struct presenta al suo interno migliaia e migliaia di record, capisci che l'utilizzo di un puntatore diventa necessario...

altro esempio: un vettore dichiarato come tale


v[size]

è limitato dal fatto che esso potrà riferirsi sempre e solamete a quel specifico indirizzo di memoria

un vettore dichiarato in questo modo


*v


è più svincolato da certe restrizioni: puoi utilizzarlo come vettore, ma poi puoi utilizzarlo anche per un altro vettore da te dichiarato cambiandone l'indirizzo di memoria.

oregon
07-03-2007, 14:59
Le tue idee sono molto confuse e ti assicuro che dipende dal fatto che ancora non conosci molto del linguaggio, a parte i puntatori. Il fatto stesso che tu non sappia leggere la frase con la malloc, significa che, per ora, devi fermarti e aspettare che ti vengano spiegati i puntatori e il loro mondo ...

Un puntatore e' un modo molto potente che il linguaggio fornisce per accedere ai dati, a prescindere dai vettori. E' utilissimo in molte occasioni, a volte necessario.

Quando userai delle strutture complesse come le "liste semplici" o "liste doppiamente linkate" capirai perche' dico che i puntatori sono necessari.

Imparerai anche che, un puntatore potra' essere usato per accedere al codice, non solo ai dati. Quando tratterai (se lo farai nella tua scuola) i puntatori a funzione, capirai che questo tipo di cose bisogna studiarle prima di capire se e dove saranno utili.

UltraBeginner
07-03-2007, 17:07
Originariamente inviato da P4nico
Non conosco i malloc ma vorrei capire cosa fa la tua riga di codice, allora hai detto che il puntatore è un chat e poi questa "malloc(sizeof(char)*DimesioneTuaStringa)", cosa fa esattamente... qualcuno la potrebbe leggere?
Mi spiego... Ultra è stato chiaro ma per capire meglio come in questo caso è stato usato il puntatore volevo capire esattamente la riga di comando

Grazie

Ola,

char * pippo;

pippo = (char *) malloc(sizeof(char)*DimesioneTuaStringa) = alloca uno spazio di memoria di dimensione pari a char*DimensioneTuaSTringa, dove char indica la dimensione in byte di un carattere mentre DimensioneTuaStringa indica la lunghezza della tua stringa, e poi restituisci un puntatore di tipo char che punti all'area di memoria appena allocata.

per liberare la memoria

free(pippo)

Loading