目次 →
演算子 →
ポインタ演算子 →
Operator STRPTR (String pointer) ←オリジナル・サイト
目次 →
演算子 →
文字列演算子 →
Operator STRPTR (String pointer) ←オリジナル・サイト
文字列の文字データのアドレスを、返します。
SAdd と同じものですが、StrPtr の方が意味を想像できて使い易いと思います。
構文:
用法:
result = StrPtr
( lhs )
パラメタ:
戻り値:
記述:
この演算子は、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からの違い:
FreeBASICで新規作成。ですが、SAdd と同じものです。
参照: