Repository 32bit  Forum
Repository 64bit  Wiki

Domanda puntatori C

Forum dedicato alla programmazione.

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.

Domanda puntatori C

Messaggioda Slack_Eater » sab mag 08, 2010 1:29

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
Avatar utente
Slack_Eater
Linux 2.0
Linux 2.0
 
Messaggi: 163
Iscritto il: gio feb 14, 2008 21:29
Località: Svizzera
Nome Cognome: Giuseppe Scalzi
Slackware: 13.37
Kernel: 2.6.38.2-smp
Desktop: KDE 4.7.0

Re: Domanda puntatori C

Messaggioda sya54M » sab mag 08, 2010 8:44

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.
Avatar utente
sya54M
Linux 3.x
Linux 3.x
 
Messaggi: 1432
Iscritto il: mer giu 06, 2007 13:44
Località: (Salerno)
Nome Cognome: Andrea P.
Slackware: 64-current
Kernel: 3.17.x
Desktop: KDE 4.14

Re: Domanda puntatori C

Messaggioda robbybby » sab mag 08, 2010 9:09

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.
Avatar utente
robbybby
Linux 3.x
Linux 3.x
 
Messaggi: 1178
Iscritto il: sab dic 16, 2006 10:48
Località: Fra Trantor e Terminus
Slackware: 13.1 / 64 bit
Kernel: 3.3.x
Desktop: KDE 4.4.5

Re: Domanda puntatori C

Messaggioda targzeta » sab mag 08, 2010 9:21

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
Linux Registered User #454438
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama
20/04/2013 - Io volevo Rodotà
Avatar utente
targzeta
Iper Master
Iper Master
 
Messaggi: 6189
Iscritto il: gio nov 03, 2005 14:05
Località: Carpignano Sal. (LE) <-> Pisa
Nome Cognome: Emanuele Tomasi
Slackware: current
Kernel: latest stable
Desktop: IceWM

Re: Domanda puntatori C

Messaggioda sya54M » sab mag 08, 2010 9:39

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
Avatar utente
sya54M
Linux 3.x
Linux 3.x
 
Messaggi: 1432
Iscritto il: mer giu 06, 2007 13:44
Località: (Salerno)
Nome Cognome: Andrea P.
Slackware: 64-current
Kernel: 3.17.x
Desktop: KDE 4.14

Re: Domanda puntatori C

Messaggioda targzeta » sab mag 08, 2010 9:48

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
Linux Registered User #454438
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama
20/04/2013 - Io volevo Rodotà
Avatar utente
targzeta
Iper Master
Iper Master
 
Messaggi: 6189
Iscritto il: gio nov 03, 2005 14:05
Località: Carpignano Sal. (LE) <-> Pisa
Nome Cognome: Emanuele Tomasi
Slackware: current
Kernel: latest stable
Desktop: IceWM

Re: Domanda puntatori C

Messaggioda sya54M » sab mag 08, 2010 9:57

Slack_Eater chiedeva dei vantaggi pratici
Avatar utente
sya54M
Linux 3.x
Linux 3.x
 
Messaggi: 1432
Iscritto il: mer giu 06, 2007 13:44
Località: (Salerno)
Nome Cognome: Andrea P.
Slackware: 64-current
Kernel: 3.17.x
Desktop: KDE 4.14

Re: Domanda puntatori C

Messaggioda targzeta » sab mag 08, 2010 10:03

sya54M ha scritto:Slack_Eater chiedeva dei vantaggi pratici

Va bene, hai ragione tu.

Emanuele
Linux Registered User #454438
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama
20/04/2013 - Io volevo Rodotà
Avatar utente
targzeta
Iper Master
Iper Master
 
Messaggi: 6189
Iscritto il: gio nov 03, 2005 14:05
Località: Carpignano Sal. (LE) <-> Pisa
Nome Cognome: Emanuele Tomasi
Slackware: current
Kernel: latest stable
Desktop: IceWM

Re: Domanda puntatori C

Messaggioda sya54M » sab mag 08, 2010 10:07

:? però non sono fesso
Avatar utente
sya54M
Linux 3.x
Linux 3.x
 
Messaggi: 1432
Iscritto il: mer giu 06, 2007 13:44
Località: (Salerno)
Nome Cognome: Andrea P.
Slackware: 64-current
Kernel: 3.17.x
Desktop: KDE 4.14

Re: Domanda puntatori C

Messaggioda targzeta » sab mag 08, 2010 10:11

sya54M ha scritto::? però non sono fesso

:lol:, 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
Linux Registered User #454438
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama
20/04/2013 - Io volevo Rodotà
Avatar utente
targzeta
Iper Master
Iper Master
 
Messaggi: 6189
Iscritto il: gio nov 03, 2005 14:05
Località: Carpignano Sal. (LE) <-> Pisa
Nome Cognome: Emanuele Tomasi
Slackware: current
Kernel: latest stable
Desktop: IceWM

Re: Domanda puntatori C

Messaggioda sya54M » sab mag 08, 2010 10:19

hai ragione, abbiamo dilungato il discorso per niente su una fesseria
Avatar utente
sya54M
Linux 3.x
Linux 3.x
 
Messaggi: 1432
Iscritto il: mer giu 06, 2007 13:44
Località: (Salerno)
Nome Cognome: Andrea P.
Slackware: 64-current
Kernel: 3.17.x
Desktop: KDE 4.14

Re: Domanda puntatori C

Messaggioda Slack_Eater » sab mag 08, 2010 21:26

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
Avatar utente
Slack_Eater
Linux 2.0
Linux 2.0
 
Messaggi: 163
Iscritto il: gio feb 14, 2008 21:29
Località: Svizzera
Nome Cognome: Giuseppe Scalzi
Slackware: 13.37
Kernel: 2.6.38.2-smp
Desktop: KDE 4.7.0

Re: Domanda puntatori C

Messaggioda absinthe » lun mag 10, 2010 7:36

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
Avatar utente
absinthe
Iper Master
Iper Master
 
Messaggi: 2354
Iscritto il: sab mag 14, 2005 23:00
Località: Prato
Nome Cognome: Matteo Nunziati
Slackware: 12.1 - defunct
Kernel: 2.6.32-5-amd64
Desktop: gnome
Distribuzione: debian squeeze

Re: Domanda puntatori C

Messaggioda Calzo » mar mag 11, 2010 17:02

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
Avatar utente
Calzo
Linux 2.0
Linux 2.0
 
Messaggi: 112
Iscritto il: sab ott 06, 2007 21:21
Località: MN
Slackware: 10.2 | 13
Desktop: Fluxbox | KDE


Torna a Programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite

cron