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


30

Qual è il tuo metodo preferito per dichiarare un puntatore?

int* i;

o

int *i;

o

int * i;

o

int*i;

Per favore, spiega perché.

vedi anche: http://www.stroustrup.com/bs_faq2.html#whitespace


19
Preferirei concentrarmi sulle altre 3000 linee ...

29
int*i;- gli spazi bianchi non crescono sugli alberi, sai ...
Shog9

Questa è essenzialmente la stessa domanda; ecco la mia risposta .
Keith Thompson,

Risposte:


75

Se scrivi:

int* i, j, k;

suggerisci fuorviante che tutti i, j e k sono puntatori a int.

Quindi sostengo che sia superiore allegare * al nome della variabile.


35
E suggerirei che int * i;è un non contendente solo perché sembra una moltiplicazione a colpo d'occhio.
John K,

1
+1 perché non avevo considerato questo scenario prima.
apre il

4
"suggerisci fuorviante che tutti i, j e k sono puntatori a int." A meno che tu non stia scrivendo C #, dove int*viene visto come un tipo e int* i, jdichiara due puntatori. La domanda potrebbe essere considerata incompleta - dipende dal linguaggio che stai usando quali stili sono ragionevoli. In CI seguo int *x, in C # faccio diversamente.
Joren,

1
@Joren: Spiacente, non essendo un programmatore C #, ho semplicemente assunto guardando il frammento di codice nella domanda era C o C ++.
Randall Schulz,

Penso che sia perfettamente ragionevole supporre che il suo C o C ++ a meno che C # non sia specificamente menzionato. Non si vedono puntatori in C # molto spesso.
alternativa il

62

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


8
Anch'io seguo questa convenzione. Per la stessa ragione.
gablin,

5
Personalmente, se sto dichiarando più puntatori nel mio codice, lo tratto come un odore di codice. Non dovrei aver bisogno di tanti suggerimenti; e di solito no. Quindi il problema di più dichiarazioni su una sola riga non si presenta mai in nessun codice che scrivo: una dichiarazione per riga.
Greyfade,

5
Il problema è che il tipo non è un "puntatore a un int". C (e C ++) non ha un tipo di puntatore. È un puntatore a un blocco di memoria, di cui è tipo int.
Billy ONeal,

10
Direi che *iha un tipo di int.
Tim Goodman,

5
@Billy: Se è così, non ho mai visto quella confusione in 12 anni nel tentativo di capire, analizzare e spiegare lo standardese. "Pointer to an int" è un tipo perfettamente valido in C e C ++.

23

Per C, dove non ci concentriamo molto sui tipi, preferisco:

int *i;

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


2
Buon punto. Con i puntatori, puoi pensare che l'inizio sia parte del nome. Ad esempio, se hai int i = 5, per ottenere il valore di i, usi il nome i. Allo stesso modo, se hai int *i; *i = 5, quindi per ottenere il valore, usi *i.
mipadi,

Ho letto int * i come: * i è un int. Pertanto io sono un puntatore a int. Le dichiarazioni di variabili in C usano espressioni di tipo, int e * sono solo operatori. int * i analizza come int (* (i)) ed è interpretato come ho tipo pointer-to integer. char * p [] analizza come char (* ([] (p))) (perché [] ha una precedenza maggiore rispetto a *) e significa: p ha tipo array-of pointer-to char.
Giorgio,

Per questo motivo penso che abbiano scelto di scrivere * accanto alla variabile, perché * è un operatore applicato ad essa.
Giorgio,

7

Ho preferito int* iper anni. Tuttavia, esiste un argomento forte int *iperché, quando si utilizza lo stile precedente, è comunque necessario ricordare la regola delle dichiarazioni multiple:

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

Poiché devi ricordare questa regola, non ne guadagni in modo semplice, ma non direi che è anche 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, sembra un po 'sciocco far finta che la sintassi della dichiarazione C funzioni diversamente da quella, posizionando l'asterisco accanto al tipo anziché alla variabile a cui è sintatticamente associato.

Io non comprare in quella enfatizza il tipo di puntatore (per i), mentre l'altro sottolinea il tipo int (per *i), ma che può essere che dopo 15 anni di utilizzo C e C ++, semplicemente è quando la guardo, senza dovendoci pensare⁠ —⁠qualcosa che la maggior parte dei principianti che pone questa domanda non può ancora fare.

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

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


6

Preferisco il primo. Viene naturale come essere un puntatore fa parte del tipo.

Mentre uso C #, gestisce i tipi in un modo più intuitivo di C, quindi non c'è problema a dichiarare più puntatori nella stessa istruzione:

int* a, b, c; // three pointers


4

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 modello struct, preferisco lo int* istile.)

Ed ecco una soluzione più generale:

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

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

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

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

identity<int&>::type r1(*p1), r2(*p2), r3(*p3);

omg, c ++ mostra sempre qualcosa di nuovo per me :). Grazie!
Tamás Szelei,

1
OMG, C ++ è terrificante! typedef int* int_ptravrebbe fatto il trucco. Certo, devo dichiarare un nuovo typedef per diversi tipi di puntatore, ma in pratica quanti saranno? Otto al massimo?
benzado,

1
@benzado In pratica, non è necessario il typedef o uno qualsiasi dei trucchi di fantasia che ho dimostrato, perché nessuna persona sana di mente dichiara più variabili in una riga. Comunque interessante, comunque.
fredoverflow,

2
Lo so, stavo parlando di più della tendenza dei programmi C ++ di usare le funzionalità del linguaggio solo perché possono.
benzado,

@benzado: !!! L'ho visto così spesso!
Giorgio,

2

Vorrei 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 sia inte il nome sia *i. Inoltre, mi int * i;sembra un po 'una moltiplicazione.


La sintassi della dichiarazione C non è coerente in questo senso, poiché le informazioni sul tipo possono facilmente venire dopo l'identificatore: le matrici sono l'esempio più chiaro.

@Roger: lo so, ma questa domanda riguardava specificamente una singola dichiarazione di variabile e nient'altro.
Allon Guralnek,

Penso che ci stia leggendo un po '. :) Il modo in cui capisco la domanda, mi sta chiedendo quale stile usi ovunque.

@Roger: Probabilmente hai ragione, ma il mio obiettivo era rispondere alla domanda del PO: "Qual è il tuo metodo preferito per dichiarare un puntatore?". Ovviamente, tutti sono liberi di dare un'occhiata al problema presentato nella domanda, ed è persino incoraggiato qui. Come qualcuno che non si sviluppa in C / C ++, ho pensato che farlo si sarebbe allontanato troppo dal mio campo di competenza.
Allon Guralnek,

2

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

Il puntatore contribuisce sia al tipo che alla variabile, quindi dovrebbe essere nel mezzo.

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


1

In realtà utilizzo tutte e tre le convenzioni in circostanze specifiche. A prima vista sembro incoerente, ma ...

  • int * quando l'identificatore non è presente, per rinforzare visivamente che il nome non è presente.
  • int* intptrsu typedefdichiarazioni simili per rafforzare visivamente che fa parte del tipo. Allo stesso modo con le dichiarazioni del puntatore a funzione:(int* (*foo)(int))
  • int *identifiere class &identifiersui parametri di funzione per rafforzare visivamente che il parametro è potenzialmente un cosiddetto parametro "out".
  • const int * const * constogni volta che uso qualificatori CV .
  • int * foo; sulle dichiarazioni locali.

Immagino di essere un po 'orientato alla vista.


1

Non ci sono tipi di puntatori in C! Quindi, "int *" non significa nulla. L'asterisco è sempre associato all'elemento scritto a destra, appartiene all'elemento proprio ad esso. "* i" è un int. E a causa di * i è un int, ne consegue che i è un puntatore a int. Questa è la logica che sta dietro ed è per questo che "int * i" è l'unica soluzione possibile. Tutto il resto è un'illusione (che viene corretta automaticamente dal compilatore nella maggior parte dei casi). In C ++ e C # è qualcosa di diverso. Ma per C c'è solo una bibbia: "Dennis M. Ritchie: The C Programming Language". Dennis (RIP!) Lo ha scritto: "int * i". Non è necessario interrogarlo.


6
"Non ci sono tipi di puntatori in C" - Dove hai preso quell'idea? int*è un tipo di puntatore.
Keith Thompson,

-2

Lo uso int *iperché è più facile vedere che si tratta di un puntatore, anche se non penso che sia davvero questione.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.