2016-04-22 29 views
5

Tôi đang làm việc thông qua Tìm hiểu C The Way cứng và đang đấu tranh để hiểu một cái gì đó trong Bài tập 16: Structs và con trỏ đến chúng.Tại sao có một con trỏ lồng nhau bên trong định nghĩa C struct?

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; 
} 

Tôi hiểu rằng cấu trúc Người trả về một con trỏ (* person_create) vào đầu cấu trúc. Nhưng tại sao có một định nghĩa struct thứ hai cho Person ngay lập tức lồng vào bên trong? Chỉ vào * ai?

Ai đó có thể làm sáng tỏ điều này cho tôi. Hoặc chỉ cho tôi hướng một lời giải thích tốt hơn các định nghĩa struct trong C.

+1

Chúng tôi đang thiếu (nhưng có thể đoán) định nghĩa về 'struct Person' –

+1

Không. Hàm 'Person_create' trả về một con trỏ tới một' Person'. Biến 'who' giữ giá trị được hàm trả về. Bạn cấp phát bộ nhớ và lưu bản sao của vị trí bộ nhớ. Sau đó bạn thiết lập các trường khác nhau của cấu trúc này trước khi cuối cùng trả về vị trí của bộ nhớ được cấp phát, trong trường hợp này, bắt đầu của một 'Person'. (bạn có được hang của chúng với tiếp tục sử dụng) :) - Con trỏ có một tương tự thô với số trang trong một cuốn sách - họ cho bạn biết nơi để tìm một cái gì đó, với lợi thế nhất của nói (theo loại của con trỏ) những gì sẽ có . – enhzflep

Trả lời

5

Tôi hiểu rằng struct Person trả về một con trỏ (*person_create)

Chờ, nó không phải là những gì bạn nghĩ, hoặc ít nhất là bạn don Không nói theo cách đó ....

Ở đây, person_create() là một hàm , trả về con trỏ đến struct Person. Đây là không phải định nghĩa của struct Person.

Bây giờ, những gì đã nói, đến quetion thực tế của bạn, struct Person *whokhông xác định struct Person, đúng hơn, nó định nghĩa một biến who mà là một con trỏ đến struct Person.

Để dễ hiểu, hãy xem xét int someRandomVariable = 0. Nó không xác định int, phải không? Nó định nghĩa một biến số someRandomVariable của loại int.

+0

Yeah. Sử dụng các từ "Tôi hiểu" trong trường hợp này là chút lạc quan. Tôi thực sự không chắc chuyện gì đang diễn ra. –

+0

Cảm ơn btw. Đó là giúp đỡ. Sẽ viết một số ý kiến ​​cho nó và dành thời gian suy nghĩ. –

1

Hàm trả về một con trỏ kiểu struct Person *, nói cách khác là con trỏ đến struct Person.

Đặc biệt ở đây con trỏ bạn sẽ quay trở lại có tên là who, như bạn có thể hiểu từ tuyên bố struct Person * who = .... Do đó, bạn cần cấp phát bộ nhớ cho biến who, mà bạn sẽ điền và trả về con trỏ đến.

Các vấn đề liên quan