2015-05-21 9 views
6

Recentemente ho iniziato a studiare su strutture e puntatori, ma c'è qualcosa che non ho capito del design di un struct. Comprendo la dichiarazione del struct i.e typedef struct Alias e il suo contenuto, ma non capisco Get_noAllyp e *no_getOf alla fine della dichiarazione. Quali sono? Neanche io potrei davvero trovare una buona fonte.Come una struttura viene digitata su più nomi?

typedef struct Alias { 
    char *s_a_name; 
    char **s_aliases; 
    short *s_dumr; 
    int  s_get_sum; 
}Get_noAllyp, *no_getOf; /*Here, I don't understand this one. 
         Where did these two variables come from? 
         And one of them is a pointer.*/ 
+4

Non utilizzare entrambi i tag 'C' e' C++ '. Sono lingue diverse e hanno regole diverse (sebbene abbiano molto in comune). – axiac

+0

Il codice postato sta creando due tipi (Get_noAllyp e * no_getOf) Tuttavia, il nome del tag struct è 'Alias', quindi questi due tipi hanno nomi che sono molto fuorvianti. I nomi dei tipi fuorvianti causeranno equivoci, errori di codice, ecc. In generale, non digitare mai una definizione di struct. È molto più chiaro scrivere "struct Alias" o "struct Alias ​​*" piuttosto che cercare di ricordare che "no_getOf" è in realtà un puntatore e in realtà è un puntatore a una struttura Alias. Il typedefing di una struct ingombra il codice, porta a errori di comprensione e ingombrare lo spazio dei nomi del compilatore. – user3629249

+0

@ user3629249 Bene, grazie signore! Ma il codice snippet era solo un puro esempio di come alcune strutture possono essere viste nei codici sorgente, quindi molto fastidioso se la struttura ha un nome schifoso alla fine come sopra. Capisco che tali nomi di strutture non siano una buona pratica e molto confusi. Ma ancora una volta, avrei ancora bisogno di un chiarimento anche se era _Alias ​​e * pAlias ​​:) –

risposta

9

Si definisce più typedef s, cioè multilple "nomi" per la stessa cosa, mentre il secondo è un puntatore ad esso.

Il primo Get_noAllyp è il nome assegnato per la struttura, mentre no_getOf rappresenta un puntatore ad esso.

I.e, la scrittura no_getOf è completamente uguale alla scrittura di Get_noAllyp * in firme di funzione o dichiarazioni di variabili.

+1

Oh .. Fantastico, avevo davvero bisogno di capire questo perché non potevo semplicemente capire una cosa semplice quando tali strutture venivano. Grazie Mark –

+1

Nessun problema. Per favore accetta la mia risposta se ti ha aiutato. –

+1

@CalCharlesFox Non preoccuparti, dopo [accettare] (http://meta.stackexchange.com/q/5234) questa risposta, sarai in grado di farlo. :-) –

7

Qui, ci sono due typedef s in cassa breve. Quanto sopra typedef può essere suddiviso come

typedef struct Alias { 
    char *s_a_name; 
    char **s_aliases; 
    short *s_dumr; 
    int  s_get_sum; 
}Get_noAllyp;     

typedef struct Alias * no_getOf; 

Quindi,

  • Get_noAllyp rappresenta struct Alias
  • no_getOf rappresenta struct Alias *
+0

Oh fantastico ... Il puntatore uno rappresenta il puntatore della struttura? Fantastico e grazie Sourav! –

+1

@CalCharlesFox Prego. :-) –

3

Il codice:

struct Alias { 
    char *s_a_name; 
    char **s_aliases; 
    short *s_dumr; 
    int  s_get_sum; 
} 

definisce un nuovo tipo di dati che ha il nome Alias ed è un struct. Il design originale della lingua C è un po 'maldestro in quanto richiede che i nomi dei tipi di struttura siano sempre preceduti dalla parola chiave struct quando vengono utilizzati.

Questo significa che il codice:

struct Alias { 
    char *s_a_name; 
    char **s_aliases; 
    short *s_dumr; 
    int  s_get_sum; 
} Get_noAllyp, *no_getOf; 

dichiara la variabile di tipo Get_noAllypstruct Alias e la variabile di tipo no_getOfpointer to struct Alias.

Inserendo la parola chiave typedef davanti, gli identificatori Get_noAllyp e no_getOf diventano tipi (e non variabili).

Get_noAllyp è la stessa struct Alias e no_getOf è uguale struct Alias * (cioè un puntatore a una struct Alias`).

Ora si può scrivere:

struct Alias x; 
struct Alias *y; 

o

Get_noAllyp x; 
no_getOf y; 

per dichiarare x come una variabile di tipo struct Alias e y come una variabile di tipo pointer to a struct Alias.

+0

Fantastica spiegazione @axiac! Grazie :) Posso finalmente leggere i codici quindi scrivere in un modo migliore! –

Problemi correlati