我實現C中的隊列我有一個像結構:int *和Type *有區別嗎?
struct Node {
Node* next;
Node* previous;
// data
}
因爲next
和previous
只是指針,它有所作爲,如果我用Node*
或int*
?例如:
struct Node {
int* next;
int* previous;
// data
}
我實現C中的隊列我有一個像結構:int *和Type *有區別嗎?
struct Node {
Node* next;
Node* previous;
// data
}
因爲next
和previous
只是指針,它有所作爲,如果我用Node*
或int*
?例如:
struct Node {
int* next;
int* previous;
// data
}
使用int *
不正確,導致不確定的行爲。您可以使用Node *
或void *
,但如果您使用Node *
以外的任何其他類型,則需要先將其轉換爲Node *
,然後才能對其進行解引用。
它不僅使你的代碼變得清晰(這很重要,你的項目越大),指針數學只在正確類型的數學運算時才能正常工作。在你的實例中,向Node *加1會導致將sizeof(Node)添加到基指針,這幾乎保證不會是== sizeof(int)。
對於你給出的例子,這可能不太重要(但你需要一個演員陣容)..但是請你自己幫忙,現在就養成使用正確類型的好習慣。
是的。 Node
不是int
(Node
將會大於int
),所以指向int
的指針或指向Node
的指針將會有所作爲。
當您使用int *時,表示您指向一個整數,並且當您使用Node *時,這意味着您指向一個節點。
區別在於指針指向空間的大小。當它的int *,pointer ++將通過sizeof(int)移動指針,並且當它的Node *時,指針++將通過sizeof(Node)移動指針。
每個人都對一切都是正確的。
關鍵是,即使你可能知道指針的內部表示是一個地址,不管數據類型如何,C都不會做出這樣的假設。
包含顯式類型允許編譯器更好地檢查代碼。
當然,您總是可以將指針指向不同的類型,但是您需要在其正確的上下文中使用鑄造類型。順便說一句,嚴格的C我學到了(回到侏羅紀時代)不會允許你的第一個例子(C++的確如此,現在的一些C編譯器也這樣做)。相反,你不得不說
struct Node {
struct Node* next;
struct Node* previous;
// data };
如果
Node * pNode;
的期望是能夠寫出像下面沒有任何投
(*pNode).next = ...
pNode->next = ...
奇怪的編譯器,將需要表達'結構'但是允許''''...... – 2010-09-22 03:29:24
一點也不奇怪。這是標準C. – 2010-09-22 03:31:49
知道C編譯器允許使用這種奇怪的方式來引用沒有前導struct的'struct'標記會很有趣。這種隱式查找只在C++中定義,在標準C中是錯誤的。 – 2010-09-22 07:52:03