2010-09-22 89 views
3

我實現C中的隊列我有一個像結構:int *和Type *有區別嗎?

struct Node { 
    Node* next; 
    Node* previous; 
    // data 
} 

因爲nextprevious只是指針,它有所作爲,如果我用Node*int*?例如:

struct Node { 
    int* next; 
    int* previous; 
    // data 
} 

回答

5

使用int *不正確,導致不確定的行爲。您可以使用Node *void *,但如果您使用Node *以外的任何其他類型,則需要先將其轉換爲Node *,然後才能對其進行解引用。

8

它不僅使你的代碼變得清晰(這很重要,你的項目越大),指針數學只在正確類型的數學運算時才能正常工作。在你的實例中,向Node *加1會導致將sizeof(Node)添加到基指針,這幾乎保證不會是== sizeof(int)。

對於你給出的例子,這可能不太重要(但你需要一個演員陣容)..但是請你自己幫忙,現在就養成使用正確類型的好習慣。

4

是的。 Node不是intNode將會大於int),所以指向int的指針或指向Node的指針將會有所作爲。

0

當您使用int *時,表示您指向一個整數,並且當您使用Node *時,這意味着您指向一個節點。

區別在於指針指向空間的大小。當它的int *,pointer ++將通過sizeof(int)移動指針,並且當它的Node *時,指針++將通過sizeof(Node)移動指針。

2

每個人都對一切都是正確的。

關鍵是,即使你可能知道指針的內部表示是一個地址,不管數據類型如何,C都不會做出這樣的假設。

包含顯式類型允許編譯器更好地檢查代碼。

當然,您總是可以將指針指向不同的類型,但是您需要在其正確的上下文中使用鑄造類型。順便說一句,嚴格的C我學到了(回到侏羅紀時代)不會允許你的第一個例子(C++的確如此,現在的一些C編譯器也這樣做)。相反,你不得不說

struct Node { 
    struct Node* next; 
    struct Node* previous; 
    // data }; 
+0

奇怪的編譯器,將需要表達'結構'但是允許''''...... – 2010-09-22 03:29:24

+1

一點也不奇怪。這是標準C. – 2010-09-22 03:31:49

+0

知道C編譯器允許使用這種奇怪的方式來引用沒有前導struct的'struct'標記會很有趣。這種隱式查找只在C++中定義,在標準C中是錯誤的。 – 2010-09-22 07:52:03

0

如果

Node * pNode; 

的期望是能夠寫出像下面沒有任何投

(*pNode).next = ... 
pNode->next = ... 
相關問題