(Risolto) [C] Spiegazioe di una dichiarazione

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Avatar utente
bite
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 3798
Iscrizione: sabato 19 maggio 2007, 22:10

Re: [C] Spiegazioe di una dichiarazione

Messaggio da bite »

belin ha scritto: A proposito, visto che ci siamo, e visto che siete molto preparati...
...così vi spremo un pò... ;D
Poteste, per piacere, farmi qualche esempio di utilià delle due dichiarazioni?
Ciao e sempre grazie!
L'array di puntatori ti permette di raccogliere in un array puntatori ad entità (variabili, strutture, funzioni...) uniformi per tipo che stanno dove vogliono loro (ad esempio la prima potrebbe essere un elemento di un altro array, la seconda una variabile sciolta, la terza un membro di una struttura, e così via) e di gestirle comodamente, ad esempio con un loop.

Oppure ti permette di dichiarare l'array alle sue dimensioni massime e poi di allocare dinamicamente solo gli elementi che ti servono davvero (questo ha senso se il puntato occupa più memoria del puntatore).

Il puntatore ad un array ha l'utilità che hanno in generale tutti i puntatori:
1) passare argomenti ad una funzione senza copiarli
2) vedere i dati sotto un'altra forma tramite cast
e infine non dimentichiamo la più importante:
3) fare segmentation fault  (rotfl)

Devo dire che non ho mai provato nella mia vita l'impulso irresistibile a fare uso di puntatori ad array.

In generale, in C++ si sente molto meno il bisogno dei puntatori, perché ci sono le reference.
Avatar utente
preben
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1188
Iscrizione: giovedì 12 luglio 2007, 20:58

Re: [C] Spiegazioe di una dichiarazione

Messaggio da preben »

Grazie bite, mi hai tolto dei macigni dallo stomaco.
Sei stato dettagliato e preciso.
Ciao e un grazie ancora a tutti.
Ora sono sicuro di aver risolto la questione.
Ciao!
Accusare gli altri delle proprie disgrazie è conseguenza della nostra ignoranza!
Avatar utente
mous16
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 3940
Iscrizione: mercoledì 25 ottobre 2006, 15:51
Sesso: Maschile

Re: (Risolto) [C] Spiegazioe di una dichiarazione

Messaggio da mous16 »

belin ha scritto: Grazie bite, mi hai tolto dei macigni dallo stomaco.
Sei stato dettagliato e preciso.
Ciao e un grazie ancora a tutti.
Ora sono sicuro di aver risolto la questione.
Ciao!
Quoto
Pagine personali: Forum Ubuntu-it - Wiki Ubuntu-it - Launchpad
Solo/mous16
Avatar utente
IppatsuMan
Prode Principiante
Messaggi: 199
Iscrizione: mercoledì 14 febbraio 2007, 1:31
Contatti:

Re: (Risolto) [C] Spiegazioe di una dichiarazione

Messaggio da IppatsuMan »

Tanto per riassumere la cosa la regola d'oro quando si leggono le dichiarazioni C è:
Inizia dal nome della variabile (o dalla dichiarazione più interna se non c'è alcun identificatore). Guarda a destra senza saltare una parentesi è dì quello che leggi. Leggi a sinistra senza saltare una parentesi e dì quello che leggi. Esci dal primo blocco di parentesi, guarda a destra senza saltare parentesi e dì quello che leggi. Guarda a sinistra e dì quello che leggi. Esci da un blocco di parentesi, leggi a destra, leggi a sinistra... e così via finché non hai finito tutto.

Quindi, prendendo int *frog[5]; si hanno i passi:
  • (guardo al centro) frog è
  • (guardo a destra) frog un array di 5
  • (guardo a sinistra) puntatori a...
  • (guardo a destra) {non c'è nulla}
  • (guardo a sinistra) intero
Quindi frog è un array di dimensione 5 di puntatori a int.

Prendendo int (*frog)[5] si ha:
  • (variabile) frog è
  • (guardo a destra) {c'è una parentesi che non posso saltare}
  • (guardo a sinistra) un puntatore a...
  • (salto il blocco di parentesi e guardo a destra) un array di 5...
  • interi
Quindi frog è un puntatore a un array di 5 interi.

Funziona anche con i puntatori a funzione, ad esempio char *(*foo)();
  • foo è
  • (guardo a destra: non c'è nulla, guardo a sinistra) un puntatore a...
  • (tolgo le parentesi e guardo a destra) funzione (le "()" vogliono dire "funzione")
  • (guardo a sinistra) che restituisce un puntatore a...
  • (guardo a destra: non c'è nulla, guardo a sinistra) char
Quindi char *(*foo)() vuol dire che foo è un puntatore a una funzione che restituisce un puntatore a char.
ハッカー
Avatar utente
preben
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1188
Iscrizione: giovedì 12 luglio 2007, 20:58

Re: (Risolto) [C] Spiegazioe di una dichiarazione

Messaggio da preben »

Grandissimo!
Spiegazione eccezionale.
Grazie. Ciao!
Accusare gli altri delle proprie disgrazie è conseguenza della nostra ignoranza!
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 4 ospiti