julia可以像C一样获取内存地址(指针)吗?


#1

julia可以像C一样获取内存地址(指针)吗?


#2

可以的有Ptr类型,但是和C不同的是语言里是没有内存地址对应的。也就是说不保证一定会有内存地址(因为可能会被优化掉)。

不过Array类型是有内存地址的,它相当于一个C动态数组。


#3

如果你需要和其他语言交互,用Ref可以使一个值拥有固定内存位置,然后可以取地址:

julia> r=Ref(42)
Base.RefValue{Int64}(42)

julia> pointer_from_objref(r)
Ptr{Nothing} @0x00000001169bc5d0

julia> unsafe_load(Ptr{Int64}(ans))
42

Ref也可以直接传递给ccall。你需要保证在对方使用完之前r不会被垃圾回收。

事实上mutable对象都是有内存地址的:

julia> mutable struct M
           x::Int
       end

julia> m=M(42)
M(42)

julia> pointer_from_objref(m)
Ptr{Nothing} @0x0000000116a10100

julia> unsafe_load(Ptr{Int}(ans))
42

普通的类型,比如字面值1,是immutable的,虽然实现上也许它真的有内存地址(CPU寄存器放不下的话可能在栈上),但为了避免抽象泄漏,Julia不允许你尝试获取它们的地址。