一份简单的指针/引用总结

话说文档里指针部分只是略微提到一点
我把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}

我写了个“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))

顺带一问:使用可变数组开销比指针/引用小吗?为什么我从未见过它的应用?

3 个赞

大佬可以看看1.6版本的文档

我能看懂每个汉字,但连起来我怎么就看不懂呢。

熟悉C/C++的比较容易懂一些,不过反正纯Julia编程用到的机会不多,除了在broadcast里

???

@Gnimuc 也许你可以直接去更新一下上游的文档 …? 让它对新手更友好一些?

问题是,写相关文档开发者并不清楚新手对文档哪部分有问题。

新手愿意写自己对文档的理解固然很好,但是得在不增加更多误解的前提下。

这里只是想表达OP直接按英文语序翻译,翻译的不符合汉语习惯。

好了我回来了
我的风格确实奇怪,请见谅
个人觉得这样写可以更清晰地参考,而不是上下翻找(?)