2013-06-26 137 views
2

我希望有人能告訴我,如果我的理解是正確的。這是我的教授給我們的第一項任務的解決方案的一部分。Typedef結構理解

typedef struct alias{ 
    char *name; 
    int numvalues; 
    char *values[MAXARGS]; 
    struct alias *next; 
} alias_node, *alias_nodeptr; 

alias_nodeptr alias_dictionary; 

所以我們定義一個struct的別名,名稱,numvalues和值是所有熟悉我,但定義「結構別名*未來;」我們正在別名結構中定義一個別名類型,這就像鏈接列表中的頭指針。那麼最後我們定義了alias_node,* alias_nodeptr,這是我們將用來遍歷列表的指針,而最後一行我很困惑,我希望有人能夠向我解釋這一點,並糾正我我誤解任何東西。

謝謝!

回答

2

之後typedef struct alias將等同於alias_nodestruct alias *將等於alias_nodeptr。你可以互換使用它們。您不能在結構本身內使用alias_nodealias_nodeptr,因爲尚未評估將該結構綁定到新名稱的typedef。

它可能有點令人困惑,因爲該結構包含numvalueschar *values[MAXARGS]。儘管這是一個有效的結構:節點的鏈表,每個節點都包含一個名稱和一組多個(numvalues)值。這裏沒有「list header」結構,只有節點。您可以使用鏈接列表而不創建標題。您只需要記住指向列表中第一個節點的指針。

1

看來你對typedef部分的理解有點不正確。上面的代碼中你的代碼做了三件事情:它聲明並定義了一個名爲struct alias型,它採用typedef創建類型別名到struct aliasstruct alias *類型,並聲明瞭一個名爲alias_dictionary變量,其類型是那些typedef d別名之一。

首先,你這樣做:

typedef struct alias{ 
    char *name; 
    int numvalues; 
    char *values[MAAXARGS]; 
    struct alias *next; 
} alias_node, *alias_nodeptr; 

現在,這是同時做兩件事情,所以我會更簡單地再說一遍:

struct alias { 
    char *name; 
    int numvalues; 
    char *values[30]; 
    struct alias *next; 
}; 
typedef struct alias alias_node, *alias_nodeptr; 

這是完全一樣的東西,分兩步完成。

首先,我們聲明一個struct alias,它是一個複合類型,它包含一個指向char的指針,一個int,一個指向char的指針數組和一個指向結構體的指針。 其次,我們定義了兩個類型別名,alias_nodealias_nodeptr,這樣聲明alias_node foo;等價於聲明struct alias foo;,而alias_nodeptr bar等價於聲明struct alias * bar;

最後,第三。

alias_nodeptr alias_dictionary; 

現在,它應該是相當明顯的,這是做什麼。您正在聲明名爲alias_dictionary的變量,該變量是指向struct alias的指針。