{{fbdoc item="title" value="Operator @ (Address of)"}}---- Returns the address of a string literal, variable, object or procedure {{fbdoc item="syntax"}}## [[KeyPgDeclare|declare]] [[KeyPgOperator|operator]] **@** ( [[KeyPgByref|byref]] //rhs// [[KeyPgAs|as]] //T// ) [[KeyPgAs|as]] //T// [[KeyPgPtr|pointer]] ## {{fbdoc item="usage"}}## //result// = **@** //rhs// ## {{fbdoc item="param"}} ##//rhs//## The string literal, variable, object or procedure to retrieve the address of. ##//T//## Any [[CatPgStdDataTypes|standard]], [[CatPgUserDefTypes|user-defined]] or procedure type. {{fbdoc item="ret"}} Returns the address of the right-hand side (##//rhs//##) operand. {{fbdoc item="desc"}} **##Operator @## (Address of)** returns the memory address of its operand. When the operand is of type ##[[KeyPgString|String]]##, the address of the internal string descriptor is returned. Use ##[[KeyPgOpStrptr|Operator Strptr]]## (String pointer) to retrieve the address of the string data. The operand cannot be an array, but may be an array element. For example, ##"@myarray(0)"## returns the address of ##"myarray(0)"##. This operator can be overloaded for user-defined types as a member ##[[KeyPgOperator|Operator]]## using the appropriate syntax. {{fbdoc item="ex"}} {{fbdoc item="filename" value="examples/manual/operator/address-var.bas"}}%%(freebasic) 'This program demonstrates the use of the @ operator. Dim a As Integer Dim b As Integer Dim addr As Integer Ptr a = 5 'Here we place the values 5 and 10 into a and b, respectively. b = 10 'Here, we print the value of the variables, then where in memory they are stored. Print "The value in A is ";a;" but the pointer to a is ";@a Print "The value in B is ";b;" but the pointer to b is ";@b 'Now, we will take the integer ptr above, and use @ to place a value into it. 'Note that the * will check the value in the ptr, just as @ checked the ptr 'for a normal variable. addr = @a Print "The pointer addr is now pointing at the memory address to a, value: ";*addr addr = @b Print "The pointer addr is now pointing at the memory address to b, value: ";*addr %% {{fbdoc item="filename" value="examples/manual/operator/address-func.bas"}}%%(freebasic) 'This program demonstrates how the @ symbol can be used 'to create pointers to subroutines. Declare Sub mySubroutine () Dim say_Hello As Sub() say_Hello = @mySubroutine 'We tell say_Hello to point to mySubroutine. 'The sub() datatype acts as a pointer here. say_Hello() 'Now we can run say_Hello just like mySubroutine. Sub mySubroutine Print "hi" End Sub %% {{fbdoc item="lang"}} - In the //[[CompilerOptlang|-lang qb]]// dialect, this operator cannot be overloaded. {{fbdoc item="diff"}} - New to ""FreeBASIC"" {{fbdoc item="see"}} - ##[[KeyPgOpVarptr|Varptr]]## - ##[[KeyPgOpProcptr|Procptr]]## - ##[[KeyPgOpValueOf|Operator * (Value of)]]## - [[ProPgPointers|Pointers]] {{fbdoc item="back" value="CatPgOpPoint|Pointer Operators"}}{{fbdoc item="back" value="CatPgOperators|Operators"}}