>>643
sub Test(byval st as string ptr)
print *st
end sub

dim as string*10 a = "abcd"
print @a
Test(@a)

問題部分を抜き出してみた
まず言えることは、上記の例であれば、Test()関数のstring ptr型と変数aのポインタの型が違う
string型は内部にポインタ(記述子)を持つ構造体のようなもので
動的にメモリを確保して代入された文字列を格納する
だから@により得られるアドレスはその構造体のアドレス
strptr()関数で得られるアドレスは指し示す文字列のアドレスと2種類ある
string*N型のように固定長文字列にした場合、その両者のアドレスが同じになるけれど
その型のポインタは、その文字列のポインタとなる
関数の引数は、あくまでstring型のポインタだから
「passing different pointer types, as parameter 1(st) of TEST()」って警告が出る

結論としては、string型は可変長文字列として使うために用意された型なので
可変長文字列として扱うか、zstring型のポインタを代わりに使うかすれば良い