2012-11-03 16 views
2

我沒有太多的經驗管理指針和其他高級功能,但我想如果有可能使用指針來交換數組的兩個元素之間的內存地址的算法,而不是複製和移動每個值時間(排序時的示例)。讓我解釋:可能在陣列的指數之間交換內存地址?

設想這樣陣列它有10種元素未排序,我裝用冒泡排序對它進行排序(以任何次序),典型的方法是使用一個輔助變量複製的元件和使用它作爲繞過每次我找到一個更小或更大的數字(取決於降序或增加排序)。

  *----*----*----*----*----*----*----*----*----*----* 
array[10] = | 45 | 21 | 32 | 48 | 32 | 22 | 47 | 10 | 11 | 12 | 
      *----*----*----*----*----*----*----*----*----*----* 
      ^----- Imagine this is 10000 

的程序來實現,該陣列[1]比數組[0]變小,所以氣泡排序將使用二次變量作爲旁路交換它們的值(這是典型的方式)。

    *--------------* 
        |   ^
        |    | 
      *--------------*--------------*----*----*----*----*----*----* 
array[10] = |  45  |  21  | 32 | 22 | 47 | 10 | 11 | 12 | 
      *--------------*--------------*----*----*----*----*----*----* 
        |   ^
        | *------* | 
        *-->|BYPASS|---* 
         *------* 

所以不可能說像交換&數組[0]和&陣列[1]的地址?所以我避免了二級變量?在這種情況下,& array [1] = 10000; & array [0] = 10004.

感謝您的關注和允許的所有建議!

+0

不,它是一種數組索引對應於地址的簡單方法。但是,爲什麼你想避免臨時變量?如果你想分類的東西很大,你應該排序指針。 –

+0

如果你能以某種方式改變某些東西的地址(而不是將它複製到新的地方,但是改變地址 - 無論這意味着什麼),世界將停止產生任何意義。不錯的頭像。 – harold

回答

1

你可以做到這一點

array[0] += array[1]; 
array[1] = array[0] - array[1]; 
array[0] -= array[1]; 

,並且不使用第三個變量。

數組是連續的內存空間。你不能排序它。它不是一個LinkedList,你只需要交換這樣的指針即可。

+0

謝謝,當你談到鏈表時,你點亮了我 –

+0

我覺得提及列表會讓你明白爲什麼你不能做你想做的事情:)但是對於心理體操,想想你能做什麼的含義如果你可以交換地址。陣列如何知道在哪裏看?你怎麼知道你是否碰到陣列的末端?所有的指針會立即變成指針指向還是...? (char **)在這個意義上意味着什麼?那彙編程序呢?鏈接?編譯器?如果您可以交換地址,他們將如何知道生成的代碼類型?堆棧指針?這一切都是不確定的,因此停止了有意義的事情。 – Shark

+0

而當你的頭從所有這些中超載時,請考慮交叉編譯,在另一個架構上編譯代碼。然後考慮生成這樣一個交叉編譯器。突然間你會發現它必須以這種方式工作 - 它目前的工作方式:)然後,如果有適當的硬件支持,你的想法可能是可行的;但是它必須在您的硬件上使用定製的,特定於硬件的編譯器,這些編譯器的MMU和裸機允許在運行時重新映射/重新分配內存。這聽起來...異國情調:) – Shark