根據語言標準,它們是有效的因此應該被允許。
現在,如果你問這一切如何工作,這很容易。
指針通常只是內存地址。如果對象由整數個字節表示(每個字節都有一個唯一的地址),則可以有一個指向內存中任何對象的指針。我在這裏說「整數」,因爲你不能有一個指向結構位域的指針(至少,你不能有一個指向那些不在字節邊界上開始並佔用整數個字節的指針) 。
因此,Ptr2
只是一個事先已知大小的指針類型(如果您的CPU的地址空間是從0到4 GB,則32位地址足以尋址每個字節,32位將是本機指針大小)這個CPU),並且您可以爲struct Rec1
和struct Rec2
中的這樣一個指針分配空間,即使這個指針指向的內容還不知道,這就是我們在代碼中遇到的問題。 Ptr1
和Ptr2
被定義爲不完整的類型,這是這個的正式名稱。
在語言中實現這種不完整指針類型的基本原理非常實用。如果你想創建鏈表或樹,它們的元素或節點必須以某種方式指向其鏈接的其他元素或節點。理論上,您可以爲最後一個元素(或葉節點)創建不同的元素/節點類型,然後爲指向它的那個創建不同的元素/節點類型,然後爲指向該元素的元素/節點類型創建一個,依此類推。但是,如果你不僅僅只有少數幾個元素或者節點,那麼這並不能很好地擴展。如果你想要一百萬呢?確定一百萬個幾乎相同的類型是不切實際的。所以,該語言爲您提供了一條捷徑,以避免這種情況。您也可以將next
指針指定爲void*
指針,但是隨後您需要將它們全部投射到struct Rect1*
或struct Rect2*
,並且維護和調試此類代碼時容易出錯。所以,在那裏,語言給你一個手。
是的,這段代碼是有效的。你有什麼特別的問題? – 2013-02-26 02:34:36
你的問題到底是什麼?你想要解釋什麼?你發佈了一些有效的代碼,一個相當基本的代碼,並問爲什麼它是有效的......這就像問爲什麼2 + 2是4.如何回答這樣的問題?你在這段代碼中看到的是什麼引起了你的注意? – AnT 2013-02-26 02:52:13
@AndreyT - 我在一本書中讀過這段代碼,並沒有說它是否有效。我最近了解了結構和他們可以申報的方式,所以我想我會把這個問題提交給社區,看看有什麼解釋! – thestralFeather7 2013-02-26 03:12:41