话说文档里指针部分只是略微提到一点
我把help文档翻译一下作为补充
notes
Ptr
Ptr{T}
指向T类型的地址(不保证地址可用、那里有所需数据)
Ptr{T}()
返回T类型空指针,特别地,T为Nothing
(别名Cvoid
)时此值为C_NULL
,即C的NULL
,C++11的nullptr
pointer_from_objref(x)
指向x的指针(x应为可变的)(注意:julia有垃圾回收机制,应手动销毁指针)pointer(array [,index])
获取数组某索引的指针(注意同上)unsafe_pointer_to_objref(p::Ptr)
获取p指向的元素,不安全
Ref
Ref{T}
一个安全引用T类型数据的对象。这种类型保证指向有效的、由julia分配的内存正确的类型。底层数据受到保护,垃圾收集器不会释放。
- Ref对象用
[]
加载或存储 - 创建一个类型为T的值x的Ref通常写成
Ref(x)
- 创建内部指针到容器(如
Array
),可以写Ref(a,i)
来引用a的第i个元素 Ref{T}()
创建对T类型值的引用而不初始化,此时引用是未定义的(抛出UndefRefError
异常)isassigned(ref::RefValue)
检查ref是否未定义- 当作为调用
ccall
参数传递时,Ref对象将被转换为指向它引用的数据- 对于大多数T,或者当转换为
Ptr{Cvoid}
时,这是一个指向对象数据的指针 - T是
isbits
(纯数据)类型,则该值可以安全地发生突变,否则突变是严格未定义行为 - 特殊情况:当T为
Any
时,将创建指向引用本身的指针Ptr{Any}
)
- 对于大多数T,或者当转换为
我写了个“Ref实现的栈示例”
mutable struct BadStack
data::Int
ref::Ref{BadStack}
function BadStack(x::Int=0,r::Ref{BadStack}=Ref{BadStack}())
return new(x,r)
end
end
function push(p::Ref{BadStack},x::Int)
return Ref(BadStack(x,p))
end
function empty(p::Ref{BadStack})
return isassigned(p)
end
function top(p::Ref{BadStack})
return p[].data
end
function pop(p::Ref{BadStack})
return p[].ref
end
t=Ref(BadStack(6))
t=push(t,8)
println(top(t))
t=pop(t)
println(top(t))
顺带一问:使用可变数组开销比指针/引用小吗?为什么我从未见过它的应用?