2016-04-22 20 views
5

Sto lavorando a Learn C The Hard Way e sto lottando per capire qualcosa nell'Esercizio 16: Strutture e puntatori a loro.Perché c'è un puntatore annidato all'interno di una definizione di struct C?

struct Person *Person_create(char *name, int age, int height, int weight) 
{ 
    struct Person *who = malloc(sizeof(struct Person)); 
    assert(who != NULL); 

    who->name = strdup(name); 
    who->age = age; 
    who->height = height; 
    who->weight = weight; 

    return who; 
} 

Comprendo che struct Person restituisce un puntatore (* person_create) all'inizio della struct. Ma perché c'è una seconda definizione di struttura per Persona immediatamente annidata all'interno? Indicando * chi?

Qualcuno può far luce su questo per me. O indicarlo verso una migliore spiegazione della definizione struct in C.

+1

Manca (ma potrebbe indovinare) la definizione di 'struct Person' –

+1

No. La funzione 'Person_create' restituisce un puntatore a un' Person'. La variabile 'who' contiene il valore restituito dalla funzione. Si assegna la memoria e si salva una copia della posizione in cui si trova la memoria. Quindi si impostano i vari campi di questa struttura prima di restituire infine la posizione della memoria allocata, che in questo caso è l'inizio di una 'Persona'. (si ottiene il blocco di essi con l'uso continuato) :) - I puntatori hanno una grossolana analogia con i numeri di pagina in un libro - ti dicono dove trovare qualcosa, con l'ulteriore vantaggio di raccontare (dal tipo del puntatore) cosa ci sarà . – enhzflep

risposta

5

Capisco che struct Person restituisce un puntatore (*person_create)

Aspetta, non è quello che pensi, o almeno si don 't dire che in quel modo ....

Qui, person_create() è una funzione , che restituisce un puntatore a struct Person. Questo è non una definizione di struct Person.

Ora, detto questo, a venire al tuo quetion attuale, struct Person *whonon significa definire il struct Person, piuttosto, definisce una variabile who che è un puntatore a struct Person.

Per facilità di comprensione, considerare int someRandomVariable = 0. Non definisce int, giusto? Definisce una variabile someRandomVariable di tipo int.

+0

Sì. L'uso delle parole "I understand" in questo caso è un po 'ottimistico. Non sono sicuro di cosa stia succedendo. –

+0

Grazie a tutti. Questo è di aiuto. Scriverà alcuni commenti e passerà un po 'di tempo a pensare. –

1

La funzione restituisce un puntatore del tipo struct Person *, in altre parole un puntatore a struct Person.

In particolare qui il puntatore che si restituisce è denominato who, come si può capire dalla dichiarazione struct Person * who = .... Pertanto, è necessario allocare memoria per la variabile who, che verrà compilata e restituire un puntatore a.

Problemi correlati