指標 (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"))