こんな関数に
コード: 全て選択
Sub Proc(ByRef Num As Long)
Num = 1
End Sub
Proc(0)という呼び出しはできないというのはなんとなくわかると思います。
引数が関数の戻り値の場合もこれと同じ扱いを受けます。
Naruさんの例では実際には変数の中身を書き換えてはいませんが、ByRefを指定すると書き換えられるものとして扱われるのでNaruさんのコードもエラーになってしまいます。
しかし抜け穴があってPrintString(ByVal VarPtr(myString))とすればコンパイルできるんですね。
どういうことかというとByRefの引数はByVal VarPtr()と等価になります。
つまりPrintString(myStringPtr)という呼び出しはPrintString(ByVal VarPtr(myStringPtr))と同じになります。
String型は表面上BytePtrと同じように文字列をさすポインタからなっているのでこういう芸当が出来るんです。