Newsgroup: it.comp.lang.c
Titolo: Puntatori: help me

Salve a tutti,
ho da poco iniziato a studiare il linguaggio C, e come -penso- tutti,
sui puntatori/stringhe  ho iniziato ad avere delle difficoltà di
comprensione.
Ho scritto per prova il seguente codice che dovrebbe stamapare a video i
carattre dell'alfabeto. Se possibile vorrei che mi chiariste i seguenti
punti, dato che non trovo per adesso una fonte cartacea che mi sia di
aiuto.
char conta,*p,*ptr;
ptr=malloc(35*sizeof(char))
p=ptr
for (conta=65;conta<91;conta++)
 {
  *p++=conta;
/*
 1-come funziona questa istruzione  ?
 2-viene eseguito prima l'assegnamento o l'incremento?
 /*
  /*
  3- Le due  istruzioni che seguono, sono l'equivalente di quella di
sopra VERO o FALSO?
  4- perche  la printf mi visualzza valori del 'cacchio' e non i valori
dei codici ASCII corretti?
  5- perche se inverto le due istruzioni la prinf visualizza i valori
corretti?
  6- perche allora, la stringa visualizzata (secondo me  giustamente )
non è corretta?
  *p=conta;
   p++;
 */
printf("p: %d ",*p);
 }
/* fine stringa*/
*p='\0';
/* Visualizzazione stringa */
 puts(ptr);
Spero di non aver omesso nella copia niente e di essermi spiegato bene
dato che ho le idee un po' confuse e
grazie per il tempo concessomi.
Najro

 non è corretta?
A me risulta corretta.
EMG

  2-viene eseguito prima l'assegnamento o l'incremento?
Basta guardare la precedenza degli operatori. Io non ho voglia di farlo, per
cui semmai scrivo sempre:
*(p++) = conta;
e sono sicuro di non sbagliare, oltre ad essere più leggibile.
Nota che anche:
ptr[conta-65] = conta;
funzionerebbe bene.
Meglio ancora, riscrivendo anche il for:
for (conta = 'a'; conta++; conta<='z'; conta++)
    ptr [conta - 'a'] = conta;
Cosa te ne pare? Fai a meno di un puntatore alias, e mi sembra sia più
chiaro lo scopo delle istruzioni.
Invece di risponderti punto per punto ho preferito farti vedere come si
potrebbe risolvere il problema scrivendo codice più pulito.
Ovviamente il mio stile potrebbe non essere il migliore, ma credo sia meglio
di quello che avevi scritto tu.
Ciao
--
Alessandro Monti

 codice. Sbaglio?
Si, ma almeno so che incremento il puntatore e non il valore puntato, mi
sembrava che fosse questo il dubbio, e la forma che avevo proposto mi
sembrava lo evidenziasse:
*(p++)
posto che il post incremento viene fatto, appunto, dopo la valutazione del
valore, mi sembra più chiaro cosa sia incrementato.
Bisogna comunque sapere che l'incremento viene fatto dopo l'intera
istruzione e non dopo le parentesi, ma credevo fosse noto.
Come regola poi bisognerebbe decidersi a non usare le forme ++ e --, essendo
SEMPRE poco leggibili. Mettere una linea in più non costa niente, no?
--
Alessandro Monti

codice. Sbaglio?
Che ne dici di 
a = b+++c ; 
?
:)
--------------------------------------------------------
* Andrea Laforgia        (
andrea_...@bigfoot.com
) *
--------------------------------------------------------

SEMPRE poco leggibili. Mettere una linea in più non costa niente, no?
Non e' vero, le forme in questione nascono per offire un aiuto alla
scrittura del codice, non vedo perche' non bisogna utilizzarle.
A questo punto servirebbe fare qualcosa del genere :
#define IS_NOT_EQUAL_TO  !=
#define NOT              !
#define AND              &&
#define BIT_AND          &
ecc... ecc... per rendere il codice leggibile, ma nessuno, credo, lo
troverebbe comodo.
Il punto di forza del C e' proprio quello di avere una sintassi che
consenta di scrivere velocemente il codice.





 scrittura del codice, non vedo perche' non bisogna utilizzarle.
No, intendevo solo metterle su una riga a parte:
    *p = ...;
    p++;
invece di
    *p++ = ...;    // o ++p, non credo faccia molta differenza
Credo ci si metta 1 decimo di secondo in più a scriverlo, ma è
immediatamente chiara la semantica.
Considera che recentemente ho scritto una cosa del tipo:
if (a-->b)
    ...
Credi che rileggendolo dopo 2 giorni abbia capito cosa era davvero? I 2
"meno" mi sembravano uno solo, dando così l'impressione di essere un
puntatore a struct (di cui il resto del codice è pieno).
Mettere uno spazio in più in questo caso è bastato, ma non si può pensare di
far dipendere la manutenibilità da uno spazio :-)
Ciao
--
Alessandro Monti

 i puntatori sono troppo importanti per avere dei dubbi.
Certo, credo che senza i puntatori rimangano pochi altri motivi per cui
usare il C.
Di dubbi credo ne abbiano in molti; sicuramente io ne ho, dato il numero di
bug che riesco sempre ad inserire nei miei programmi :-)
--
Alessandro Monti

 Ulp! E che accidenti significa? :-)
  Somma 'b' e 'c' e metti in risultato in 'a', *poi* incrementa 'b' di
uno. ;)
	Alla prossima,
		Marco

 a = b+++c ;
Ulp! E che accidenti significa? :-)
EMG

 Cosa significa deferenziare?
"dereferenziare" significa applicare ad un puntatore l'operatore * per
accedere alla variabile a cui esso sta puntando.
EMG

puntatore a struct (di cui il resto del codice č pieno).
Infatti questo e' uno dei tipici errori in cui si incorre con la
sintassi criptica del C !


i puntatori sono troppo importanti per avere dei dubbi.
Devi insistere, la buona comprensione dell'uso dei puntatori evita la
maggior parte degli errori.
