FreeBASIC マニュアルのトップに戻る

FreeBASIC OpStrptr

目次演算子ポインタ演算子Operator STRPTR (String pointer)←オリジナル・サイト
目次演算子文字列演算子Operator STRPTR (String pointer)←オリジナル・サイト

演算子 StrPtr (文字列ポインタ) 左にメニュー・フレームが表示されていない場合は、ここをクリックして下さい


文字列の文字データのアドレスを、返します。
SAdd と同じものですが、StrPtr の方が意味を想像できて使い易いと思います。

構文:
declare 演算子 StrPtr ( byref lhs as string ) as zstring ptr
declare 演算子 StrPtr ( byref lhs as wstring ) as wstring ptr

用法:
result = StrPtr ( lhs )

パラメタ:
lhs
文字列

戻り値:
string/wstring の文字データへの Zstring/wstring Ptr を返します(空の文字列の場合は null 値)。

記述:
この演算子は、string/wstring の文字データの先頭を指す Zstring/wstring Ptr を返します。
演算子 StrPtr は、文字列の文字データのアドレスを取得する、適切な方法です。
string(可変長文字列のみ)の場合、演算子 StrPtr は null ポインタを返します。

関連する 演算子 Varptr (変数ポインタ)演算子 @ (Address of) は、String と共に使うと、内部の文字列記述子のアドレスを返します。

可変長文字列が変更されると、その記述子のアドレスは常に同じままですが、文字列の文字データのアドレス(演算子 StrPtr によって返される)は変更される可能性があります(再割り当てが必要な割り当てられたメモリのように)。
固定長文字列が変更されても、文字列の文字データアドレス(演算子 StrPtr によって返される)は変更されません。

注: 可変長文字列の場合、演算子は Zstring Const Ptr を返します (文字列記述子に設定された文字列の文字ポインターを、参照によって返すため、これは読み取り専用と見なされます)。
キーワード Var を使って、Operator StrPtr からユーザーポインターを宣言/初期化する場合、このユーザーポインターも、読み取り専用として定義されます(これ以上変更できません)。

警告: fbcバージョン1.20.0以降、zstring ポインタを STRING*N 型の固定長文字列(以前のように末尾にヌル文字が追加されなくなった)に逆参照すると、何らかの汚れによって文字列が拡張されたり、完全にクラッシュしたりすることがあります。

例:
'' この例は、StrPtr を使った、文字列のポインターの用法を示します。
Dim myString As String
Dim toMyStringDesc As Any Ptr
Dim toMyStringStrPtr As ZString Ptr
Dim toMyStringSAdd As ZString Ptr

'' 標準の VARPTR 記法を使うと、文字列データ自身ではなく、
'' 記述子へのポインタを返すことに、注意して下さい。
myString = "演算子 @ (のアドレス)は、文字列には不適切なメソッドです!"
toMyStringDesc = @myString
Print myString
Print "演算子 @ (記述子へのポインタ) = " ;toMyStringDesc ,Hex( toMyStringDesc )
Print

'' しかし、StrPtr を使うと、適切なポインタが返ります
myString = "StrPtr は、文字列に適切なメソッドです!"
Print myString
toMyStringStrPtr = StrPtr(myString)
Print "StrPtr(文字列へのポインタ) = "; toMyStringStrPtr
Print *toMyStringStrPtr
Print

toMyStringSAdd = SAdd(myString)
Print "SAdd  (StrPtr と全く同じ) = "; toMyStringSAdd
Print *toMyStringSAdd
Print

'' そして、ポインタは、他の型へのポインタのように、機能します
myString = "MyString が変更されました(文字データのアドレスは変更されません)"
Print myString
Print *toMyStringStrPtr
Print *toMyStringSAdd
Print
Print "再度文字列データを変更します"
Print
myString = "青は藍より出でて藍より青し"
Print myString
Print *toMyStringStrPtr
Print *toMyStringSAdd

Sleep


例2: ポインタ演算子で取得する値
Dim As String alphab = "ABCDEFGHIJ"

Print "文字列     " ;"SAdd ポインタ " ;"StrPtr ポインタ ";"VarPtr ポインタ ";"@ ポインタ"
'Print "String", "SAdd", "StrPtr", "VarPtr", "Address of"

For i As UInteger = 0 To 9
   Print Chr(alphab[i]), SAdd(alphab), StrPtr(alphab), VarPtr(alphab[i]), @alphab[i]
Next
Print

Dim ArrayStr(15) As String
Dim i As Integer
Dim Counter As Integer

Counter = 0

Print "文字列     " ;"SAdd ポインタ " ;"StrPtr ポインタ ";"VarPtr ポインタ ";"@ ポインタ"
'Print "String", "SAdd", "StrPtr", "VarPtr", "Address of"

For i = Asc("A") To Asc("Z")-15
   Counter = Counter + 1
   ArrayStr(Counter) = Chr(i, i+1, i+2, i+3, i+4)
   Print ArrayStr(Counter) ,SAdd(ArrayStr(Counter)) ,StrPtr(ArrayStr(Counter)) ,VarPtr(ArrayStr(Counter)) ,@ArrayStr(Counter) 
Next i

Sleep


'Address of

'Difference between "Sadd", "StrPtr", "VarPtr", and "Address of"
'https://www.freebasic.net/forum/viewtopic.php?f=2&t=28698&p=274159#p274158
'by dodicat ≫ Jul 14, 2020 20:32
'
'@ is OK for variable length, it is @s[0]
'in fact @s[0] is universal, it works for everything including literals.
'It's a workaround because s[0] is a Ubyte, and @s[0] returns a Ubyte Ptr (not a (Z|W)String Ptr).

 
Dim As String s="abcdefghij"
Print "Dim As String s=""abcdefghij"""
Print "StrPtr(s)= ",StrPtr(s)
Print "@s= ",@s
Print "@s[0]= ",@s[0]
Print

Dim As String * 10 g="abcdefghij"
Print "Dim As String * 10 g=""abcdefghij"""
Print "StrPtr(g)= ",StrPtr(g)
Print "@g= ",@g
Print "@g[0]= ",@g[0]
Print

Dim As ZString * 10 h="abcdefghij"
Print "Dim As ZString * 10 h=""abcdefghij"""
Print "StrPtr(h)= ",StrPtr(h)
Print "@h= ",@h
Print "@h[0]= ",@h[0]
Print

Print "StrPtr(""ghijklmnopqrstuvw"")= ",StrPtr("ghijklmnopqrstuvw")
Print "@""ghijklmnopqrstuvw""= ",@"ghijklmnopqrstuvw"
Print "@(""ghijklmnopqrstuvw"")[0]= ",@("ghijklmnopqrstuvw")[0]
#Print TypeOf("ghijklmnopqrstuvw") 'ZString * 18
Print
Print "OutPut 画面に ZString * 18 と表示されているはず。何かキー入力で終了。"
Sleep

QBからの違い:
参照:
ポインタ演算子 に戻る
文字列演算子 に戻る
演算子 に戻る
←リンク元に戻る プログラム開発関連に戻る

ページ歴史:2024-03-07 06:25:33
日本語翻訳:WATANABE Makoto、原文著作者:LaananFisher

ホームページのトップに戻る

表示-非営利-継承