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

FreeBASIC OpAt

目次演算子ポインタ演算子Operator @ (Address of)←オリジナル・サイト

演算子 @ (のアドレス) 左にメニュー・フレームが表示されていない場合は、ここをクリックして下さい


文字列直定数、数値変数、オブジェクト、手続きの、アドレスを返します。
演算子 VarPtr (変数ポインタ) と同じものです。

構文:
declare 演算子 @ ( byref rhs as T ) as T pointer

用法:
result = @ rhs

パラメタ:
rhs
アドレスを取得する、文字列直定数、変数、オブジェクト、手続き。
T
任意の、標準ユーザ定義・手続き の型

戻り値:
右側 (rhs) 演算対象の、アドレスを返します。

記述:
演算子 @ (のアドレス) は、演算対象のメモリ・アドレスを返します。

演算対象が、String 型のときは、内部の文字列記述子のアドレスを返します。
このため、文字列データのアドレスを取得するときは、演算子 StrPtr (文字列ポインタ) を使ってください。

配列を演算対象にすることができませんが、配列の要素は対象にできます。
例えば、"@myarray(0)" は、"myarray(0)" のアドレスを返します。

この演算子は、適切な構文を使って、メンバー 演算子 として、ユーザー定義型のために、多重定義できます。

例:
'このプログラムは、@ 演算子 を使う例です。

Dim a As Integer
Dim b As Integer

Dim addr As Integer Ptr

a = 5   '値 5 と 10 を、それぞれ a と b に置きます
b = 10

'変数の値を表示します。そして、メモリで値が格納されている場所を表示します。
Print "a の値は ";a;" です。しかし a へのポインタは ";@a;" です。"
Print "b の値は ";b;" です。しかし b へのポインタは ";@b;" です。"

'今、@を使って、上の整数のポインタを取得します。
'そしてポインタの「*」で、値を表示できることに注意してください。
'"@" が、普通の変数の ptr をチェックするのと同じです。

addr = @a
Print "今、ポインタ addr は a のメモリ・アドレスを指します。そのポインタが示す値は: ";*addr

addr = @b
Print "今、ポインタ addr は b のメモリ・アドレスを指します。そのポインタが示す値は: ";*addr

Sleep



'このプログラムは、サブルーチンへのポインタを作成するための、
'@ シンボルの使い方を、示します。

Declare Sub mySubroutine ()

Dim say_Hello As Sub ()

say_Hello = @mySubroutine   'say_Hello に、mySubroutine を指すように、伝えます。
                            'ここで、sub() データ型は、ポインタとして振舞います。

say_Hello() 'いま、mySubroutine のように、say_Hello を走らせることができます。

Sub mySubroutine
    Print "hi"
End Sub

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からの違い:
参照:
ポインタ演算子 に戻る
演算子 に戻る
←リンク元に戻る プログラム開発関連に戻る

ページ歴史:2019-07-04 00:20:08
日本語翻訳:WATANABE Makoto、原文著作者:LaananFisher

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

表示-非営利-継承