PDA

View Full Version : [C]Quesito sui puntatori


desucar
21-06-2008, 17:41
Ciao a tutti.
Qual'è la differenza tra:

float *A
float* A
(float*) A

dove A è una matrice.

Grazie

khelidan1980
21-06-2008, 17:44
tra il primo e secondo no sicuramente,anche se preferisco la seconda notazione,ha più senso logico secondo me anche se tutti usano la prima!
Ma sono un principiante del C anchio! ;)

desucar
21-06-2008, 17:47
infatti. è il terzo che non capisco a cosa serva.

vizzz
21-06-2008, 18:08
infatti. è il terzo che non capisco a cosa serva.

è un cast, forzi A ad essere di tipo float*

desucar
21-06-2008, 18:19
Siccome la matrice A devo inserirla io, e la funzione che poi utilizzarà A accetta in ingresso float* A, il casting forza la matrice A ( di qualsiasi tipo essa sia) ad assere un float*A??
E' così?
grazie mille

71104
21-06-2008, 18:19
tra il primo e secondo no sicuramente,anche se preferisco la seconda notazione,ha più senso logico secondo me anche se tutti usano la prima! perché invece è molto più logica la prima visto che in una definizione gli asterischi non sono specifici del tipo ma di ciò che viene definito; infatti quando devi definire un elenco di identificatori devi sempre rispecificare gli asterischi per ogni identificatore, e possono anche differire in numero da un identificatore all'altro. lo stesso discorso vale tale e quale per gli ampersand "&" in C++, che definiscono i reference.

per fare un esempio, se oltre ad A avessi anche voluto dichiarare B avrei potuto scrivere:

float *A, *B;

che è molto diverso da

float* A, B;

poiché questa seconda dichiarazione dichiara B come float.

Albi89
21-06-2008, 18:44
perché invece è molto più logica la prima visto che in una definizione gli asterischi non sono specifici del tipo ma di ciò che viene definito; infatti quando devi definire un elenco di identificatori devi sempre rispecificare gli asterischi per ogni identificatore, e possono anche differire in numero da un identificatore all'altro. lo stesso discorso vale tale e quale per gli ampersand "&" in C++, che definiscono i reference.

per fare un esempio, se oltre ad A avessi anche voluto dichiarare B avrei potuto scrivere:

float *A, *B;

che è molto diverso da

float* A, B;

poiché questa seconda dichiarazione dichiara B come float.

E' vero, ma concettualmente trovo più corretta la forma float* a; in quanto la variabile a non è di tipo float, ma di tipo float*.
Per evitare confusioni, è sufficiente dichiarare i puntaturi su linee separate.

Tra l'altro fui molto felice quando lessi i consigli sul "Coding style" di Bruce Eckel e scoprii che consiglia di fare la stessa cosa.

khelidan1980
21-06-2008, 20:36
perché invece è molto più logica la prima visto che in una definizione gli asterischi non sono specifici del tipo ma di ciò che viene definito; infatti quando devi definire un elenco di identificatori devi sempre rispecificare gli asterischi per ogni identificatore, e possono anche differire in numero da un identificatore all'altro. lo stesso discorso vale tale e quale per gli ampersand "&" in C++, che definiscono i reference.

per fare un esempio, se oltre ad A avessi anche voluto dichiarare B avrei potuto scrivere:

float *A, *B;

che è molto diverso da

float* A, B;

poiché questa seconda dichiarazione dichiara B come float.

ok ma questa è una questioni di comodità,il tipo di quella variabile è puntatore a float,e cioè float*,almeno io la vedo cosi,diciamo che quel tipo di notazione per indicare un puntatore secondo me non è proprio azzeccatissima poi sull'esempio che hai portato niente da dire,è ovviamente normale scrivere float *a,*b


EDIT:non avevo visto,aveva già risposto Albi89 ;)

Fede_Reghe
22-06-2008, 11:30
Siccome la matrice A devo inserirla io, e la funzione che poi utilizzarà A accetta in ingresso float* A, il casting forza la matrice A ( di qualsiasi tipo essa sia) ad assere un float*A??
E' così?
grazie mille

Però attento:

(float*) A;

non ha alcun senso! Se A non è dichiarato devi usare float* A (o float *A), se devi trasformare A in un float* devi scrivere qualcosa tipo:

float* NuovoPuntatore = (float*) A;