这应该有效:
let a = ref 3 in
let address = 2*(Obj.magic a) in
Printf.printf "%d" address;;
OCaml使用单词的最低有效位区分堆指针和整数,0表示指针,1表示整数(请参阅Real World OCaml中的chapter)。
Obj.magic
是'a -> 'b
类型的函数,可以让您绕过输入(即任意“强制转换”)。如果强制OCaml通过int
不安全地将引用解释为Obj.magic
,则获得的值是右移一位的地址。要获得实际的存储器地址,需要将其向左移1位,即将值加倍。
另见answer。