However, also due to this relationship, pointers require a strong understanding by the programmer of the details of memory architecture.
In distributed computing, the reference may contain more than an address or identifier; it may also include an embedded specification of the network protocols used to locate and access the referenced object, the way information is encoded or serialized.
A reference to a live distributed object is another example: it is a complete specification for how to construct a small software component called a proxy that will subsequently engage in a peer-to-peer interaction, and through which the local machine may gain access to data that is replicated or exists only as a weakly consistent message stream.
In all these cases, the reference includes the full set of instructions, or a recipe, for how to access the data; in this sense, it serves the same purpose as an identifier or address in memory.
These objects are typically stored in one of two ways: Internal storage is usually more efficient, because there is a space cost for the references and dynamic allocation metadata, and a time cost associated with dereferencing a reference and with allocating the memory for the smaller objects.
Internal storage also enhances locality of reference by keeping different parts of the same large object close together in memory.
In assembly language, it is typical to express references using either raw memory addresses or indexes into tables.
These work, but are somewhat tricky to use, because an address tells you nothing about the value it points to, not even how large it is or how to interpret it; such information is encoded in the program logic.
It is similar to the assembly representation of a raw address, except that it carries a static datatype which can be used at compile-time to ensure that the data it refers to is not misinterpreted.
A Fortran reference is best thought of as an alias of another object, such as a scalar variable or a row or column of an array.
As in other languages, these references facilitate the processing of dynamic structures, such as linked lists, queues, and trees.
In Standard ML, OCaml, and many other functional languages, most values are persistent: they cannot be modified by assignment.
To preserve safety and efficient implementations, references cannot be type-cast in ML, nor can pointer arithmetic be performed.
The programmer is then able to enjoy certain properties (such as the guarantee of immutability) while programming, even though the compiler often uses machine pointers "under the hood".