Nim 程式設計教學:參考 (Reference) 和指標 (Pointer)

PUBLISHED ON MAR 18, 2018 — PROGRAMMING
FacebookTwitter LinkedIn LINE Skype EverNote GMail Email Email

    指標 (pointer) 儲存的不是資料,而是指向資料的記憶體位置。Nim 的指標有兩種,一種是會自動回收記憶體的指標 (即 ref),一種是需自行回收記憶體的指標 (即 ptr),預設情形下會使用前者。

    以下例子建立一個指向整數的指標:

    var n = new(int)
    
    n[] = 3
    assert(n[] == 3)
    

    我們也可以將語法稍微換一下,但是效果相同:

    var n: ref int
    new(n)
    
    n[] = 3
    assert(n[] == 3)
    

    以下例子建立一個需自行回收記憶體的指標:

    var n = cast[ptr int](alloc(sizeof(int)))
    
    n[] = 3
    assert(n[] == 3)
    
    dealloc(n)
    

    指標也像資料般,可以指派給另一個變數:

    var p = new(int)
    
    p[] = 3
    var q = p
    assert(q[] == 3)
    
    q[] = 5
    assert(p[] == 5)
    

    在 Nim 的套件中看到 xxxRef 大概就是有用到指標,如下例:

    import tables
    
    var hash = {"one": "eins", "two": "zwei", "three": "drei"}.newTable
    var hashRef = hash
    
    hashRef["four"] = "vier"
    assert(hash.hasKey("four"))