Pagina 1 di 1
Domanda puntatori C
Inviato: sab 8 mag 2010, 2:29
da Slack_Eater
Ciao a tutti,
uso C da un pò di tempo, e vorrei aumentare le mie conoscenze sull'argomento puntatori.
Cioè in pratica qualcuno mi sa spiegare come mai dovrei usarli, e che vantaggio ce realmente nell'usarli rispetto a una variabile normale?
Potreste anche fare degli esempi concreti di dove il loro utilizzo risulterebbe significativo?
Vi ringrazio
Ciaoooo
Re: Domanda puntatori C
Inviato: sab 8 mag 2010, 9:44
da sya54M
per esempio, se hai la necessità di restituire più di una variabile a chi chiama la funzione, o usi variabili pubbliche, o passi gli indirizzi di memoria delle variabili in modo da scrivere su variabili dichiarate nella funzione chiamante coi puntatori.
ma è sconsigliato dichiarare variabili pubbliche, potresti non volere che una variabile sia leggibile da tutte le funzioni.
questo perchè con la funzione return si può ritornare una sola variabile.
questa è la prima cosa che mi è venuta in mente.
Re: Domanda puntatori C
Inviato: sab 8 mag 2010, 10:09
da robbybby
Per fare, alberi, liste, e altre strutture dati di questo genere.
Per allocare un array di cui non conosci le dimensioni a compile time, ma solo a runtime.
Ecc.
Visti i tuoi dubbi, comunque, io ti consiglierei un buon libro di programmazione di base. Senza offesa, è solo che i puntatori e il loro uso in generale sono indipendenti dal linguaggio.
Re: Domanda puntatori C
Inviato: sab 8 mag 2010, 10:21
da targzeta
robbybby mi ha fregato sulle strutture dati dinamiche (ha postato prima). Un altro esempio te lo posto:
Codice: Seleziona tutto
#include <stdio.h>
int incr(int x)
{
x++;
return x;
}
void incr_p(int *x)
{
(*x)++;
}
int main()
{
int a, b;
a=b=0;
a=incr(a);
incr_p(&b);
printf("%d - %d", a,b);
return 0;
}
Come vedi in C i parametri sono passati per copia, se vuoi modificare il valore di un parametro devi anche tenere conto di questo fatto.
Emanuele
Re: Domanda puntatori C
Inviato: sab 8 mag 2010, 10:39
da sya54M
spina ha scritto:robbybby mi ha fregato sulle strutture dati dinamiche (ha postato prima). Un altro esempio te lo posto:
Codice: Seleziona tutto
#include <stdio.h>
int incr(int x)
{
x++;
return x;
}
void incr_p(int *x)
{
(*x)++;
}
int main()
{
int a, b;
a=b=0;
a=incr(a);
incr_p(&b);
printf("%d - %d", a,b);
return 0;
}
Come vedi in C i parametri sono passati per copia, se vuoi modificare il valore di un parametro devi anche tenere conto di questo fatto.
Emanuele
in questo caso è inutile usare i puntatori, ottieni lo stesso risultato in entrambe le funzioni, diventa però utile (come dicevo prima) se devi restituire più di una variabile, allora return non basta più.
Codice: Seleziona tutto
int incr(int x, int y, int z)
{
x++;
y++;
z++;
return ?????;
}
void incr_p(int *x, int *y, int *z)
{
*x++;
*y++;
*z++;
}
int main() {
int a, b, c;
a=b=c=0;
incr_p(&a, &b, &c);
printf("%d - %d - %d", a, b, c);
return 0;
}
questo è quello che volevo dire
Re: Domanda puntatori C
Inviato: sab 8 mag 2010, 10:48
da targzeta
Il mio esempio era collegato a quello che ho scritto dopo. La tua è una generalizzazione del mio concetto, che però non si limita a quello che hai scritto.
Emanuele
Re: Domanda puntatori C
Inviato: sab 8 mag 2010, 10:57
da sya54M
Slack_Eater chiedeva dei vantaggi pratici
Re: Domanda puntatori C
Inviato: sab 8 mag 2010, 11:03
da targzeta
sya54M ha scritto:Slack_Eater chiedeva dei vantaggi pratici
Va bene, hai ragione tu.
Emanuele
Re: Domanda puntatori C
Inviato: sab 8 mag 2010, 11:07
da sya54M
però non sono fesso
Re: Domanda puntatori C
Inviato: sab 8 mag 2010, 11:11
da targzeta
sya54M ha scritto: però non sono fesso
, non volevo assolutamente dire questo, penso solo che ci stiamo incartando su una cosa che trovo banale ed era un modo come un altro per chiudere il discorso...a volte dare ragione aiuta
, scusami se ho dato un'impressione sbagliata.
Emanuele
Re: Domanda puntatori C
Inviato: sab 8 mag 2010, 11:19
da sya54M
hai ragione, abbiamo dilungato il discorso per niente su una fesseria
Re: Domanda puntatori C
Inviato: sab 8 mag 2010, 22:26
da Slack_Eater
Ciao, grazie per i vostri consigli, ora ho capito un po di più sicuramente con un po di letture e pratica li saprò padroneggiare!
Grazie
Re: Domanda puntatori C
Inviato: lun 10 mag 2010, 8:36
da absinthe
un altro aspetto importante è la velocità: oltre a non fare più una copia ma scrivere sull'originale passato per puntatore, puoi usare la stessa tecnica per passare variabili con un memory footprint minore e con maggiore velocità di esecuzione.
questo di solito non conta molto se l'appicativo è un programma desktop ma fa la differenza quando lavori con risorse limitate e devi lavorare real-time o nearly-real-time.
M
Re: Domanda puntatori C
Inviato: mar 11 mag 2010, 18:02
da Calzo
Slack_Eater ha scritto:[...]e che vantaggio ce realmente nell'usarli rispetto a una variabile normale?[...]
Un altro esempio pratico (almeno per me) è legato ai puntatori a funzione.
Se per esempio hai un sistema di controllo dove fai delle acquisizioni di dati, ma poi la funzione che elabora questi dati è diversa in funzione dell'algoritmo scelto, devi solo far si che il puntatore punti ad un'altra funzione di elaborazione (magari in fase di inizializzazione) e tutto l'algoritmo (che di solito è ad alta/altissima priorità e richiede tempi di elaborazione stringenti) resta invariato.
Anche nel kernel se vai a vedere le funzioni che operano su un device file sono tutti puntatori. In funzione del tipo di device viene eseguita una funzione di sistema (write, read, ioctl, ecc) differente.
bye