2015-05-21 18 views
6

Gần đây tôi đã bắt đầu nghiên cứu về cấu trúc và con trỏ nhưng có một cái gì đó tôi không hoàn toàn hiểu về thiết kế của một struct. Tôi hiểu tuyên bố của số structtypedef struct Alias và nội dung của nó nhưng tôi không hiểu Get_noAllyp*no_getOf ở cuối tuyên bố. Họ là ai? Tôi cũng không thể tìm được nguồn tốt.Cách cấu trúc được gõ vào nhiều tên?

typedef struct Alias { 
    char *s_a_name; 
    char **s_aliases; 
    short *s_dumr; 
    int  s_get_sum; 
}Get_noAllyp, *no_getOf; /*Here, I don't understand this one. 
         Where did these two variables come from? 
         And one of them is a pointer.*/ 
+4

Không sử dụng cả hai thẻ 'C' và' C++ '. Chúng là các ngôn ngữ khác nhau và chúng có các quy tắc khác nhau (mặc dù chúng có nhiều điểm chung). – axiac

+0

Mã được đăng đang tạo hai loại (Get_noAllyp và * no_getOf) Tuy nhiên, tên thẻ cấu trúc là 'Bí danh' để hai loại đó có tên rất sai. Các tên kiểu gây hiểu nhầm sẽ dẫn đến hiểu lầm, lỗi mã, vv Nói chung, không bao giờ gõ một định nghĩa struct. Nó là rõ ràng hơn để viết 'struct Alias' hoặc 'struct Alias ​​*' hơn là cố gắng nhớ rằng 'no_getOf' thực sự là một con trỏ và thực sự là một con trỏ đến một cấu trúc Alias. Typedef'ing một cấu trúc clutters mã, dẫn đến mis-hiểu, và clutters không gian tên trình biên dịch. – user3629249

+0

@ user3629249 Vâng cảm ơn bạn sir! Nhưng đoạn mã chỉ là một ví dụ thuần túy về cách một số cấu trúc có thể được nhìn thấy trong mã nguồn do đó rất khó chịu nếu cấu trúc có một số tên crappy ở cuối của nó như được đưa ra ở trên. Tôi hiểu rằng các tên cấu trúc như vậy không phải là một thực hành tốt và rất khó hiểu. Nhưng một lần nữa, tôi vẫn cần phải làm rõ mặc dù nó là _Alias ​​và * pAlias ​​:) –

Trả lời

9

Nó định nghĩa nhiều typedef s, nghĩa là nhiều "tên" cho cùng một thứ, trong khi thứ hai là con trỏ đến nó.

Cái đầu tiên Get_noAllyp là tên được đặt cho cấu trúc, trong khi no_getOf đại diện cho con trỏ đến cấu trúc đó.

I.e, viết no_getOf hoàn toàn giống như viết Get_noAllyp * trong chữ ký chức năng hoặc khai báo biến.

+1

Oh .. Tuyệt vời, tôi thực sự cần phải hiểu điều này bởi vì tôi không thể đơn giản hiểu một điều đơn giản khi các cấu trúc đó xuất hiện. Cảm ơn Mark –

+1

Không sao cả. Vui lòng chấp nhận câu trả lời của tôi nếu nó giúp bạn. –

+1

@CalCharlesFox Đừng lo lắng, sau khi [chấp nhận] (http://meta.stackexchange.com/q/5234) câu trả lời này, bạn sẽ có thể. :-) –

7

Ở đây, có hai số typedef được xử lý theo cách ngắn gọn. Trên đây typedef có thể được chia nhỏ như

typedef struct Alias { 
    char *s_a_name; 
    char **s_aliases; 
    short *s_dumr; 
    int  s_get_sum; 
}Get_noAllyp;     

typedef struct Alias * no_getOf; 

Vì vậy,

  • Get_noAllyp đại diện struct Alias
  • no_getOf đại diện struct Alias *
+0

Oh awesome .. Con trỏ một là đại diện cho con trỏ của cấu trúc? Tuyệt vời và cảm ơn Sourav! –

+1

@CalCharlesFox Bạn được chào đón. :-) –

3

Mã:

struct Alias { 
    char *s_a_name; 
    char **s_aliases; 
    short *s_dumr; 
    int  s_get_sum; 
} 

xác định loại dữ liệu mới có tên Alias và là struct. Thiết kế ban đầu của ngôn ngữ C hơi vụng về ở đây vì nó yêu cầu tên kiểu cấu trúc luôn được bắt đầu bằng từ khóa struct khi chúng được sử dụng.

Điều này có nghĩa các mã:

struct Alias { 
    char *s_a_name; 
    char **s_aliases; 
    short *s_dumr; 
    int  s_get_sum; 
} Get_noAllyp, *no_getOf; 

tuyên bố biến Get_noAllyp loại struct Alias và biến no_getOf loại pointer to struct Alias.

Bằng cách đặt từ khóa typedef ở phía trước, số nhận dạng Get_noAllypno_getOf trở thành các loại (chứ không phải biến).

Get_noAllyp cũng giống như struct Aliasno_getOf cũng giống như struct Alias * (ví dụ: một con trỏ đến một Alias` struct).

Bây giờ bạn có thể viết:

struct Alias x; 
struct Alias *y; 

hoặc

Get_noAllyp x; 
no_getOf y; 

tuyên bố x như một biến kiểu struct Aliasy như một biến kiểu pointer to a struct Alias.

+0

Giải thích tuyệt vời @axiac! Cảm ơn :) Tôi cuối cùng có thể đọc mã do đó viết một cách tốt hơn! –

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