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.
Rispondi
Avatar utente
Slack_Eater
Linux 1.x
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

Messaggio 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

Avatar utente
sya54M
Master
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

Messaggio 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.

Avatar utente
robbybby
Linux 4.x
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

Messaggio 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.

Avatar utente
targzeta
Iper Master
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

Messaggio 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
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama

Avatar utente
sya54M
Master
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

Messaggio 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

Avatar utente
targzeta
Iper Master
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

Messaggio 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
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama

Avatar utente
sya54M
Master
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

Messaggio da sya54M »

Slack_Eater chiedeva dei vantaggi pratici

Avatar utente
targzeta
Iper Master
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

Messaggio da targzeta »

sya54M ha scritto:Slack_Eater chiedeva dei vantaggi pratici
Va bene, hai ragione tu.

Emanuele
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama

Avatar utente
sya54M
Master
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

Messaggio da sya54M »

:? però non sono fesso

Avatar utente
targzeta
Iper Master
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

Messaggio da targzeta »

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
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama

Avatar utente
sya54M
Master
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

Messaggio da sya54M »

hai ragione, abbiamo dilungato il discorso per niente su una fesseria

Avatar utente
Slack_Eater
Linux 1.x
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

Messaggio 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

Avatar utente
absinthe
Iper Master
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

Messaggio 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

Avatar utente
Calzo
Linux 1.x
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

Messaggio 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

Rispondi