C – inizializzazione dei puntatori, posizione dell’asterisco

Possibile duplicato:
Dichiarazioni del puntatore in C ++: posizionamento dell’asterisco

Qual è il modo più corretto per posizionare l’asterisco? Perché?

1) type* var; 2) type *var; 

Non importa quanto stai dichiarando un solo puntatore. Di solito è scritto come nel secondo esempio (nel codice che di solito leggo / scrivo) ma per il compilatore è lo stesso.

Il problema può emergere se stai dichiarando più di un puntatore. Ad esempio, questo non sta dichiarando due puntatori, ma dichiara un puntatore e una variabile di tipo tipo.

 type* var1, var2; 

Devi invece fare:

 type* var1, *var2; 

Preferisco usare sempre * il var.

Il puntatore è il tipo e penso che abbia più senso raggruppare le informazioni sul tipo:

 int* foo; 

Ciò può creare confusione se più variabili sono definite sulla stessa linea:

 int* foo, bar; // foo will be int*, bar will be int 

La soluzione a questo è, mai dichiarare più variabili sulla stessa linea. Qualcosa che il Code Complete sostiene, comunque.

Entrambi funzionano. Direi che il primo è più chiaro in generale , ma fuorviante in C e può portare a errori, ad esempio:

 type* var1, var2; // This actually means: type *var1; type var2; 

Quindi direi che # 2 è più idiomatico in C e quindi raccomandato, specialmente se non sei l’unico programmatore che lavora sul codice (a meno che, naturalmente, non siate tutti d’accordo su uno stile).

Come altri hanno sottolineato, entrambi funzionano bene, e quello sbagliato ha effettivamente il vantaggio dell’economia sintattica.

Per come la vedo io, una dichiarazione è composta da un tipo seguito dalla variabile .

  ; int ii; int* pii; 

Quindi, se togli la variabile , ciò che rimane è il tipo . Che è int e int * sopra. Il compilatore considera int * come un tipo internamente (che è puntatore a un int ).

C, sfortunatamente, non supporta questa syntax senza problemi. Quando dichiari più variabili dello stesso tipo, dovresti essere in grado di farlo:

  , , ; 

che non puoi con un tipo di puntatore:

 int* ii1, ii2, ii3; 

dichiara ii1 di tipo int * e il resto di tipo int . Per evitare ciò, prendo l’abitudine di dichiarare solo una variabile per riga.

Ho sentito dire che tecnicamente il * è un modificatore della variabile, e questo è evidenziato dalla necessità di usare * più volte in dichiarazioni multi-variabili es. int * p, * q, * r;

Comunque mi piace pensarlo come un modificatore del tipo base perché è quello che appare nei prototipi. per esempio. void func (int *);

.PMCD.

PS. So di non aver aiutato il tuo problema 🙂

La seconda modalità è corretta. L’altra modalità non è così chiara per un programmatore principiante. La forma int * variabile è solitamente scoraggiata

Sarebbe piuttosto la preferenza di un programmatore.

Per me, dichiaro i puntatori di:

 int * var1, var2; 

In cui var1 è un puntatore e var2 non lo è. Se si desidera dichiarare più puntatori in una riga:

 int * var1, * var2; 

E, naturalmente, l’uso degli altri modi è valido.

Non esiste un singolo “posto più adatto”.

Di solito è il posto che usa il resto del codice.

Se stai scrivendo il tuo codice dall’inizio e puoi scegliere la tua convenzione: scegli la tua convenzione e segui la stessa.

Se scegli qualcosa di diverso da type * var incontrerai situazioni “imbarazzanti”:

 /* write these with another style */ int * var; int const * var; int * restrict var; 

PS. Non dovrebbe avere importanza, ma di solito uso il type *var;

La semantica della dichiarazione segue la semantica delle espressioni (in particolare la precedenza degli operatori) e trovo le dichiarazioni più complesse più facili da leggere utilizzando il secondo stile.

Puoi pensare

 int *foo; 

dichiarando il tipo dell’espressione *foo (cioè l’operatore di riferimento indiretto applicato a foo ) per essere int invece di essere dichiarato di essere di tipo int * .

Qualunque sia la convenzione che scegli, cerca di essere coerente.