# @

English (en) suomi (fi) français (fr) русский (ru)

@

The address operator @ returns the address of an identifier that is associated with an address (usually a variable or routine, but also a label).

Normally, the value @ returns is an untyped pointer. If you are handling pointers a lot, and want to mitigate issues with passing references of wrong type's target, you have use the directive {$typedaddress on}. Here some example to demonstrate, what produces with untyped pointers valid and functional code, but semantically outputs an erroneous result: 1. program untypedAddressDemo(input, output, stderr); 2.   3. procedure incrementIntByRef(const ref: PByte); 4. begin 5.  inc(ref^); 6. end; 7.   8. var 9.  foo: integer; 10. begin 11.  foo := -1; 12.  incrementIntByRef(@foo); 13.  writeLn(foo); 14. end. It was intended, that 0 (zero) gets printed, but the program prints -256 instead. With {$typedaddress on} compilation fails with an incompatible type error. You usually want the latter behavior (compile-time failure) instead of wasting time with hours of debugging.

## other remarks

• In ASCII the character @ (AT sign): has the value 64.