int * i; o int * i; o int * i; [chiuso]

27

Qual è il tuo metodo preferito per dichiarare un puntatore?

int* i;

o

int *i;

o

int * i;

o

int*i;

Spiega perché.

vedi anche: link

    
posta lesmana 25.09.2010 - 19:49
fonte

12 risposte

73

Se scrivi:

int* i, j, k;

suggerisci in modo fuorviante che tutti i, j e k siano puntatori a int .

Quindi sostengo che sia superiore ad annettere * al nome della variabile.

    
risposta data 25.09.2010 - 20:15
fonte
60

Preferisco int* i perché i ha il tipo "puntatore a un int", e ritengo che questo lo renda uniforme con il sistema di tipi. Naturalmente, il comportamento ben noto arriva quando si tenta di definire più puntatori su una riga (vale a dire, l'asterisco deve essere inserito prima di ogni nome di variabile per dichiarare un puntatore), ma semplicemente non dichiarare i puntatori in questo modo. Inoltre, penso che sia un difetto grave nei linguaggi in stile C.

    
risposta data 25.09.2010 - 20:01
fonte
21

Per C, in cui non ci concentriamo sui tipi, preferisco:

int *i;

Perché ha un'enfesi su int , non sul puntatore. Cos'è int ? *i è l'int.

    
risposta data 25.09.2010 - 20:09
fonte
7

Preferisco il primo. Viene naturale poiché un puntatore fa parte del tipo.

Poiché utilizzo C #, gestisce i tipi in modo più intuitivo rispetto a C, quindi non ci sono problemi a dichiarare diversi puntatori nella stessa istruzione:

int* a, b, c; // three pointers
    
risposta data 26.09.2010 - 20:39
fonte
7

Ho preferito int* i per anni. Tuttavia, esiste un argomento valido per int *i perché quando si utilizza lo stile precedente, è comunque necessario ricordare la regola di dichiarazione multipla:

int* a, *b; // not int* a, b;

Perché devi ricordare questa regola, non ne guadagni in modo esplicito, ma non direi che è più complesso. Evitare dichiarazioni multiple su una riga è solo un altro modo per dire che ricordi questa regola. La differenza tra i due stili è discutibile.

Anche se lo uso, tuttavia, è un po 'sciocco fingere che la sintassi della dichiarazione C funzioni diversamente da quella, posizionando l'asterisco accanto al tipo piuttosto che alla variabile a cui è associato sintatticamente.

Non compro in quello enfatizza il tipo di puntatore (per i ) mentre l'altro enfatizza il tipo int (per *i ), ma potrebbe essere che dopo 15 anni di utilizzo di C e C ++, è è quando lo guardo, senza doverlo pensare⁠-⁠ qualcosa che molti principianti che fanno questa domanda non possono ancora fare.

Inoltre, nonostante le mie preferenze, non trovo scomodo leggere / scrivere codice nell'altro stile. Coerenza, bla bla blah.

Non c'è bisogno di menzionare nemmeno int * i .

    
risposta data 26.09.2010 - 00:41
fonte
5

Preferisco int* i (stile C ++).
Evito di dichiarare più variabili in un'istruzione a causa dell'ambiguità visiva risultante ( int* i, j ).

Vedi anche Domande sullo stile e la tecnica C ++ di Bjarne Stroustrup per le ragioni.

    
risposta data 26.09.2010 - 00:32
fonte
3

Se vuoi dichiarare più variabili ma non vuoi ripetere l'asterisco:

template <typename T>
struct pointer_to
{
    typedef T* type;
};

pointer_to<int>::type p1, p2, p3;

(Come puoi vedere all'interno del template struct, preferisco lo stile int* i .)

E qui c'è una soluzione più generale:

template <typename T>
struct identity
{
    typedef T type;
};

identity<int*>::type p1, p2, p3;

Questo funziona con qualsiasi "tipo problematico", per esempio matrici e riferimenti:

identity<int[10]>::type a1, a2, a3;

identity<int&>::type r1(*p1), r2(*p2), r3(*p3);
    
risposta data 26.09.2010 - 23:14
fonte
2

Vorrei andare per int* i; poiché la prima parte indica il tipo di variabile (puntatore a int), mentre la seconda parte indica il nome ( i ). Non avrebbe senso per me che il tipo fosse int e il nome fosse *i . Inoltre, int * i; sembra un po 'come la moltiplicazione per me.

    
risposta data 25.09.2010 - 20:14
fonte
2

Nelle dichiarazioni uso int * i; , lo leggi come i is a pointer to an integer .

Il puntatore contribuisce sia al tipo che alla variabile, quindi dovrebbe trovarsi al centro.

È una buona cosa evitare di dichiarare più cose sulla stessa linea: int * i, j;

    
risposta data 25.09.2010 - 21:53
fonte
1

Non ci sono tipi di puntatore in C! Quindi "int *" non significa nulla. L'asterisco è sempre legato all'elemento scritto a destra di esso, appartiene all'elemento giusto ad esso. "* i" è un int. E a causa di * i è un int, segue che io sono un puntatore a int. Questa è la logica dietro di esso ed è per questo che "int * i" è l'unica soluzione possibile. Tutto il resto è un'illusione (che viene automaticamente corretta dal compilatore nella maggior parte dei casi). In C ++ e C # è qualcosa di diverso. Ma per C c'è una sola bibbia: "Dennis M. Ritchie: The C Programming Language". Dennis (R.I.P.!) Lo ha scritto: "int * i". Non c'è bisogno di metterlo in discussione.

    
risposta data 22.11.2011 - 00:10
fonte
0

In realtà uso tutte e tre le convenzioni in circostanze specifiche. A prima vista mi sembra incoerente, ma ...

  • int * quando l'identificatore non è presente, per rafforzare visivamente che il nome non è presente.
  • int* intptr su typedef s e dichiarazioni simili per rafforzare visivamente che fa parte del tipo. Allo stesso modo con le dichiarazioni del puntatore di funzione: (int* (*foo)(int))
  • int *identifier e class &identifier sui parametri di funzione per rinforzare visivamente che il parametro è potenzialmente un cosiddetto parametro "out".
  • const int * const * const ogni volta che utilizzo i c-v qualificatori.
  • int * foo; sulle dichiarazioni locali.

Credo di essere un po 'visivamente orientato.

    
risposta data 25.09.2010 - 20:15
fonte
-2

Uso int *i perché è più facile vedere che si tratta di un puntatore, anche se non penso che sia davvero importante.

    
risposta data 26.09.2010 - 08:42
fonte

Leggi altre domande sui tag