There is now ...

but don't blame me if you find you continually crash your app - this is *unsafe* stuff for your program.
Pointer variables hold a pointer to memory. Because memory is addressed from location 0 upwards, you should ideally hold pointer values within a dword.
Reading a value from an address is done by prefixing the address variable with an asterix ('*').
Writing a value to an address is done in the same way.
You cannot apply pointer arithmetic while also trying to read/set the memory pointed to.
*Address+1 = 0 : ` Won't work
*(Address+1) = 0 : ` Also won't work
*Address = a+b : ` Will work
Unlike in C/C++ or Pascal, and most other languages, a pointer holds no information about the size of the memory location it points to. This is up to you, the programmer. The size is based on the variable type that you copy from/to.
Addr as dword
B as byte
W as word
I as integer
Addr = make memory(8)
*Addr = B : ` Writes a byte to the memory location
*Addr = W : ` Writes a 2-byte word to the memory location
*Addr = I : ` Writes a 4-byte integer to the memory location
Currently, pointers do not work with any types over 4 bytes in size (larger UDTs, arrays, double integers and double floats).
They *do* work with strings, in a quite useful way. When you copy a string to an address, it will give you the location of the string data in memory.
Addr as dword
StrData as dword
x$="BBBB"
*Addr = x$
StrData = *Addr
*StrData = 0x41414141 : ` Hexadecimal representation of 4 A's
print x$
To make memory access easier, I have developed a set of Peek/Poke routines written in DBPro (no external DLL's). It is not possible to do this for getting string addresses, because a copy of the string is made before it is passed to the function, meaning you only get the address of the temporary copy.
I have also included some constants that tell you the size of each type.
WARNING: Do not use the PeekString/PokeString when you have not used SYNC ON. If you do, they will take ages to run.
#constant sizeof_integer 4
#constant sizeof_string 4
#constant sizeof_float 4
#constant sizeof_boolean 1
#constant sizeof_byte 1
#constant sizeof_word 2
#constant sizeof_dword 4
#constant sizeof_doubleinteger 8
#constant sizeof_doublefloat 8
function PokeByte(Addr as dword, Value as byte)
*Addr=Value
endfunction
function PeekByte(Addr as dword)
local Value as byte
Value=*Addr
endfunction Value
function PokeWord(Addr as dword, Value as word)
*Addr=Value
endfunction
function PeekWord(Addr as dword)
local Value as word
Value=*Addr
endfunction Value
function PokeInteger(Addr as dword, Value as integer)
*Addr=Value
endfunction
function PeekInteger(Addr as dword)
local Value as integer
Value=*Addr
endfunction Value
function PokeDword(Addr as dword, Value as dword)
*Addr=Value
endfunction
function PeekDword(Addr as dword)
local Value as dword
Value=*Addr
endfunction Value
function PokeFloat(Addr as dword, Value as float)
*Addr=Value
endfunction
function PeekFloat(Addr as dword)
local Value as float
Value=*Addr
endfunction Value
function PokeString(Addr as dword, Value as string)
for i=1 to len(Value)
PokeByte(Addr, asc(mid$(Value,i)) )
Addr=Addr+1
next i
PokeByte(Addr,0)
endfunction
function PeekString(Addr as dword)
local Value as string
local Current as integer
do
Current=PeekByte(Addr)
if Current = 0 then exit
Value=Value + chr$(Current)
Addr=Addr+1
loop
endfunction Value