2013-03-25 11 views
5

Sto guardando una struttura C con una sintassi che non ho mai visto prima. La struttura si presenta così:Cosa significa `*` in una dichiarazione C `typedef struct`?

typedef struct structExample { 
    int member1; 
    int member2 
} * structNAME; 

So che normalmente con una struttura di:

typedef struct structExample { 
    int member1; 
    int member2 
} structNAME; 

ho potuto fare riferimento a un membro della seconda definizione struct dicendo:

structNAME* tempStruct = malloc(sizeof(structNAME)); 
// (intitialize members) 
tempstruct->member1; 

Cosa fa questo extra * nella prima definizione di struct e come farei di riferimento ai membri della prima definizione di struct?

+3

Non lo farei mai, a meno che non ci sia una pistola tra gli occhi –

+1

Possibile duplicato del tuo libro C –

risposta

4

Significa che il tipo definito è un tipo di puntatore. Questo è un modo equivalente a dichiarare il tipo:

struct structExample { 
    int member1; 
    int member2; 
}; 
typedef struct structExample * structNAME; 

si può usare in questo modo:

structNAME mystruct = malloc (sizeof (struct structExample)); 
mystruct->member1 = 42; 
+5

Il tuo secondo esempio dereferenzia un puntatore non inizializzato. – interjay

+1

Liberamente omettendo una specie di malloc, non è vero? – Oliver

+0

non lo userai in questo modo. – UmNyobe

1

structNAME è definito come un puntatore su struct structExample. Così si può fare

structNAME tempStructPtr = malloc(sizeOf(struct structExample)); 
tempStructPtr->member1 = 2; 
2

Il typedef rende queste due affermazioni stesso

struct structExample *myStruct; 
structName myStruct; 

Rende structName supporto per un puntatore a struct structExample

Come un parere, non mi piace questo stile di codifica, perché rende più difficile sapere se una variabile è un puntatore o meno. Essa aiuta se avete

typedef struct structExample * structExampleRef; 

per dare un suggerimento che si tratta di un puntatore a struct structExample;

0

In tal caso (* structNAME) è variabile puntatore di quella struttura ..

1

Il segreto per capire questi è che è possibile inserire typedef davanti a qualsiasi dichiarazione, per trasformare TYPENAME VARIABLENAME in typedef TYPENAME ALIASEDNAME.

Poiché l'asterisco non può far parte della parte VARIABLENAME se si trattava di una semplice dichiarazione, deve essere parte del tipo. Un asterisco che segue un nome di tipo significa "puntatore a" il tipo precedente.

confrontare questo:

typedef int * my_int_pointer; 

E 'esattamente la stessa cosa, tranne che nel tuo caso invece di int si sta dichiarando un struct.

Problemi correlati