2011-10-29 61 views
12
struct node 
{ 
    int coef; 

    int exp; 

    struct node *link; 
}; 

typedef struct node *NODE; 
+6

Xin đừng ẩn các loại trỏ đằng sau typedefs trong mã thật mặc dù . –

+2

hương vị xấu. SCNR – ninjalj

+0

cách tốt nhất để viết mã này. Trong cấu trúc sách được sử dụng theo 3 đến 4 cách ... – Skr

Trả lời

7

Nó làm cho NODE một typedef cho struct node *.

+1

điều gì sẽ là cách tốt hơn để viết mã này ... giữ nguyên ý nghĩa tương tự. – Skr

+3

Cách tốt hơn là bỏ qua typedef và tham chiếu đến kiểu con trỏ là 'struct node *'. –

18

Nó định nghĩa NODE như một từ đồng nghĩa với kiểu struct node *, vì vậy khi bạn sẽ được tuyên bố một biến kiểu NODE bạn sẽ thực sự tuyên bố một con trỏ đến struct node.

Cá nhân, tôi không nghĩ rằng tuyên bố như vậy là một ý tưởng hay: bạn đang "giấu con trỏ" (và gần như luôn là ý tưởng tồi), và hơn nữa, bạn không làm nổi bật thực tế này theo bất kỳ cách nào vào tên mới.

+4

+1 cho "Không ẩn các loại con trỏ phía sau typedef" –

+1

+1 vì lý do tương tự. Đặt tên nó là 'nodeptr' thay cho' node' sẽ giúp ích, nhưng sau đó không có lý do gì để 'gõ''. –

+1

"Đừng ẩn các loại con trỏ đằng sau typedef" ý bạn là gì bởi điều này – Skr

7

NODE trở thành bí danh cho struct node*.


EDIT: Được rồi, cho nhận xét (nếu tôi viết câu trả lời của tôi như bình luận, nó sẽ là quá dài và không định dạng):

Không có cách khác nhau để viết những dòng này. Ở đây, typedef chỉ được sử dụng để tạo một từ đồng nghĩa/bí danh cho con trỏ đến struct node.
Một ví dụ cho việc sử dụng sẽ là:

void f() 
{ 
    // some code 
    NODE p = NULL; 
    // do something with p 
    // for example use malloc and so on 
    // like: p = malloc(sizeof(struct node)); 
    // and access like: p->coef = ..; p->expr = .. 
    // do something with p and free the memory later (if malloc is used) 
} 

cũng giống như

void f() 
{ 
    // some code 
    struct node* p = NULL; 
    // do something with p 
} 

Sử dụng NODE làm cho nó chỉ ngắn hơn (dù sao, tôi sẽ không khuyên như vậy typedef, như bạn đang giấu diếm, đó là con trỏ , không phải là struct hoặc loại khác, như được đề cập trong câu trả lời của @Matteo Italia).


Định dạng, bạn đang tham chiếu: "typedef struct {} type_name format" là một thứ khác. Đó là một mẹo vặt trong C, để tránh viết struct từ khóa (vì nó bắt buộc trong C và KHÔNG ở C++). Vì vậy,

typedef struct node 
{ 
    //.. 
} NODE; 

sẽ làm cho NODE bí danh cho struct node. Vì vậy, ví dụ tương tự như trên:

void f() 
{ 
    // some code 
    NODE p; 
    // do something with p 
    // note that now p is automatically allocated, it's real struct 
    // not a pointer. So you can access its members like: 
    // p.coef or p.expr, etc. 
} 

cũng giống như

void f() 
{ 
    // some code 
    struct node p; 
    // do something with p 
} 

Chú ý rằng bây giờ, pKHÔNG một con trỏ, nó struct node.

+0

bạn có thể viết cùng một mã theo cách khác không. làm thế nào để viết cùng một mã trong typedef struct {} type_name; định dạng??? – Skr

+0

Vâng, hãy xem bản chỉnh sửa của tôi, tôi hy vọng nó sẽ rõ ràng hơn. –

+0

cảm ơn rất nhiều, tôi đã nhận nó lần này. – Skr

-3

nội dung typedef struct node *NODE cho biết điều gì?

nó cho thấy một người đã không biết được rằng chữ hoa LÀ KHÔNG TỐT

trữ ALL chữ hoa định danh cho macro.

Cheers & h.,

+0

Ngoài ra, tôi không nghĩ rằng 'NODE' chứa '*' –

+0

@ PeterLee: Cảm ơn, tôi không nghĩ đến chuyện đó. Hm, tôi thấy tò mò rằng câu trả lời được bỏ phiếu nhiều nhất là câu trả lời * không * trả lời câu hỏi về điều này "chỉ ra", và câu trả lời này, câu trả lời duy nhất cho câu hỏi, đã được bình chọn. Đó là SO. –

+0

Thậm chí nếu bạn rất chắc chắn và mát mẻ. Ngay cả khi bạn có lời khuyên tốt cho vụ án. Nó không phải là quá tốt để làm nhục mọi người. B.t.w. nó không phải là câu trả lời thích hợp cho câu hỏi. Đây là nguyên nhân chính để giảm bớt câu trả lời. – I159

0

chỉ đơn giản nói với bạn có thể tạo con trỏ kiểu nút chỉ sử dụng NODE mỗi lần thay vì writting nút struct * mọi