2016-04-22 11 views
5

私はLearn C The Hard Wayを通して働いており、練習16:ストラクチャとポインタを理解するのに苦労しています。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; 
} 

struct Personが構造体の先頭にポインタ(* person_create)を返すことを理解しています。しかし、Personにすぐにネストされた2番目の構造体定義はなぜ存在しますか? *誰を指しているの?

誰かが私のためにこれについていくつかの光を当てることができます。またはC.

+1

'struct Person'の定義がありません(しかし推測できます) –

+1

いいえ。 'Person_create'関数は' Person'へのポインタを返します。 'who'変数は、関数が返す値を保持します。メモリを割り当て、メモリがある場所のコピーを保存します。最後に、割り当てられたメモリの場所を返す前に、この構造体のさまざまなフィールドを設定します。この場合は、 'Person'の開始位置になります。 (あなたは継続的にそれらをつかまえます):) - ポインタは本のページ番号と大まかに類推します - どこに何があるかを教えます。 。 – enhzflep

答えて

5

私はstruct Personのポインタを返すことを理解における構造体の定義のより良い説明の方に私を指す(*person_create

待って、それはあなたが何を考えていないのですか、少なくともあなたドンそのように言う...

ここでは、person_create()はで、struct Personへのポインタを返すです。これはではなく、の定義struct Personです。実際quetionに来て、言った今

struct Person *whoではなく、それはstruct Personへのポインタである変数whoを定義し、struct Personを定義していません。

理解を容易にするため、int someRandomVariable = 0を検討してください。 intを定義していません。これは、タイプintの変数someRandomVariableを定義します。

+0

うん。この例では「理解しています」という言葉を使うのはちょっと楽観的です。私は本当に何が起こっているのか分からない。 –

+0

ありがとうbtw。それが助けになります。それにいくつかのコメントを書き、思考に時間を費やします。 –

1

この関数は、タイプstruct Person *のポインタ、つまりstruct Personへのポインタを返します。

ここで特に返されるポインタは、struct Person * who = ...という宣言からわかるように、whoという名前です。したがって、変数whoのためのメモリを割り当てる必要があります。これは、あなたが書き込んでポインタを返します。

関連する問題