4
隨着我繼續學習C語言,我有了疑問。使用數組中的每個元素是一個結構並使用一個數組中的每個元素都是指向相同類型的結構的指針之間的區別。在我看來,你可以同時使用兩者(儘管在指針中你必須處理內存分配)。有人可以解釋我在哪種情況下最好使用其中一種?結構體數組與指向結構體的指針數組
謝謝。
隨着我繼續學習C語言,我有了疑問。使用數組中的每個元素是一個結構並使用一個數組中的每個元素都是指向相同類型的結構的指針之間的區別。在我看來,你可以同時使用兩者(儘管在指針中你必須處理內存分配)。有人可以解釋我在哪種情況下最好使用其中一種?結構體數組與指向結構體的指針數組
謝謝。
結構和指向結構的指針數組的數組是不同的方式來組織內存。結構的
陣列具有這些長處:
struct s *p = calloc(n, sizeof(*p));
分配動態這種陣列。struct s *prev = p - 1, *next = p + 1;
他們也有缺點:
p[i].member
產生一個乘法,這可能是在某些體系結構昂貴,如果結構的大小不是2使用指針的陣列具有以下優點:
NULL
來確定。該慣例用於提供給main()
函數的argv[]
命令行參數數組。p[i].member
生成一個簡單的移位和額外的存儲器訪問,但可能比結構數組的等效表達式更有效。和以下缺點:
EDIT:作爲暗示由David保齡球,可以通過分配的結構的一方面的陣列,並且指向所述第一數組的元素的指針的一個單獨的陣列結合一些的這兩種方法的優點。這是一種實現排序順序的方便方法,甚至可以使用單獨的指針數組(如數據庫索引)實現多個伴隨排序順序。
一個示例:使用'qsort'對指針數組進行排序可能比對結構數組進行排序更快(如果結構體非常大),因爲交換兩個指針會比交換兩個結構更快。 – user3386109
^OTOH,在結構數組上的順序傳遞將更加緩存友好,並且不需要在每一步都有額外的間接尋址。 – StoryTeller
我不認爲這個問題過於寬泛:每種方法的優缺點都存在某種程度的個人意見,但問題在於真正的詢問,並列出兩種解決方案的相關特徵似乎是可行的。 – chqrlie