Domanda puntatori C
Moderatore: Staff
Regole del forum
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.
La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.
La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
- Slack_Eater
- Linux 1.x
- Messaggi: 163
- Iscritto il: gio 14 feb 2008, 21:29
- Nome Cognome: Giuseppe Scalzi
- Slackware: 13.37
- Kernel: 2.6.38.2-smp
- Desktop: KDE 4.7.0
- Località: Svizzera
- Contatta:
Domanda puntatori C
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
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
- sya54M
- Master
- Messaggi: 1665
- Iscritto il: mer 6 giu 2007, 14:44
- Nome Cognome: Andrea Peluso
- Slackware: 64-current
- Kernel: ultimo
- Desktop: KDE
- Località: (Salerno)
- Contatta:
Re: Domanda puntatori C
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.
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.
- robbybby
- Linux 4.x
- Messaggi: 1223
- Iscritto il: sab 16 dic 2006, 10:48
- Slackware: 13.1 / 64 bit
- Kernel: 3.3.x
- Desktop: KDE 4.4.5
- Località: Fra Trantor e Terminus
Re: Domanda puntatori C
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.
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.
- targzeta
- Iper Master
- Messaggi: 6629
- Iscritto il: gio 3 nov 2005, 14:05
- Nome Cognome: Emanuele Tomasi
- Slackware: 64-current
- Kernel: latest stable
- Desktop: IceWM
- Località: Carpignano Sal. (LE) <-> Pisa
Re: Domanda puntatori C
robbybby mi ha fregato sulle strutture dati dinamiche (ha postato prima). Un altro esempio te lo posto:
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
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;
}
Emanuele
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama
- sya54M
- Master
- Messaggi: 1665
- Iscritto il: mer 6 giu 2007, 14:44
- Nome Cognome: Andrea Peluso
- Slackware: 64-current
- Kernel: ultimo
- Desktop: KDE
- Località: (Salerno)
- Contatta:
Re: Domanda puntatori C
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ù.spina ha scritto:robbybby mi ha fregato sulle strutture dati dinamiche (ha postato prima). Un altro esempio te lo posto: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.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; }
Emanuele
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;
}
- targzeta
- Iper Master
- Messaggi: 6629
- Iscritto il: gio 3 nov 2005, 14:05
- Nome Cognome: Emanuele Tomasi
- Slackware: 64-current
- Kernel: latest stable
- Desktop: IceWM
- Località: Carpignano Sal. (LE) <-> Pisa
Re: Domanda puntatori C
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
Emanuele
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama
- sya54M
- Master
- Messaggi: 1665
- Iscritto il: mer 6 giu 2007, 14:44
- Nome Cognome: Andrea Peluso
- Slackware: 64-current
- Kernel: ultimo
- Desktop: KDE
- Località: (Salerno)
- Contatta:
Re: Domanda puntatori C
Slack_Eater chiedeva dei vantaggi pratici
- targzeta
- Iper Master
- Messaggi: 6629
- Iscritto il: gio 3 nov 2005, 14:05
- Nome Cognome: Emanuele Tomasi
- Slackware: 64-current
- Kernel: latest stable
- Desktop: IceWM
- Località: Carpignano Sal. (LE) <-> Pisa
Re: Domanda puntatori C
Va bene, hai ragione tu.sya54M ha scritto:Slack_Eater chiedeva dei vantaggi pratici
Emanuele
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama
- sya54M
- Master
- Messaggi: 1665
- Iscritto il: mer 6 giu 2007, 14:44
- Nome Cognome: Andrea Peluso
- Slackware: 64-current
- Kernel: ultimo
- Desktop: KDE
- Località: (Salerno)
- Contatta:
Re: Domanda puntatori C
però non sono fesso
- targzeta
- Iper Master
- Messaggi: 6629
- Iscritto il: gio 3 nov 2005, 14:05
- Nome Cognome: Emanuele Tomasi
- Slackware: 64-current
- Kernel: latest stable
- Desktop: IceWM
- Località: Carpignano Sal. (LE) <-> Pisa
Re: Domanda puntatori C
, 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.sya54M ha scritto: però non sono fesso
Emanuele
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama
- sya54M
- Master
- Messaggi: 1665
- Iscritto il: mer 6 giu 2007, 14:44
- Nome Cognome: Andrea Peluso
- Slackware: 64-current
- Kernel: ultimo
- Desktop: KDE
- Località: (Salerno)
- Contatta:
Re: Domanda puntatori C
hai ragione, abbiamo dilungato il discorso per niente su una fesseria
- Slack_Eater
- Linux 1.x
- Messaggi: 163
- Iscritto il: gio 14 feb 2008, 21:29
- Nome Cognome: Giuseppe Scalzi
- Slackware: 13.37
- Kernel: 2.6.38.2-smp
- Desktop: KDE 4.7.0
- Località: Svizzera
- Contatta:
Re: Domanda puntatori C
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
Grazie
- absinthe
- Iper Master
- Messaggi: 2354
- Iscritto il: dom 15 mag 2005, 0:00
- Nome Cognome: Matteo Nunziati
- Slackware: 12.1 - defunct
- Kernel: 2.6.32-5-amd64
- Desktop: gnome
- Distribuzione: debian squeeze
- Località: Prato
- Contatta:
Re: Domanda puntatori C
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
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
- Calzo
- Linux 1.x
- Messaggi: 112
- Iscritto il: sab 6 ott 2007, 22:21
- Slackware: 10.2 | 13
- Desktop: Fluxbox | KDE
- Località: MN
Re: Domanda puntatori C
Un altro esempio pratico (almeno per me) è legato ai puntatori a funzione.Slack_Eater ha scritto:[...]e che vantaggio ce realmente nell'usarli rispetto a una variabile normale?[...]
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