In the Nessa type system, **references** are the way the language has to make indirect value assotiations. They can be seen
as analogous to *pointers* in languages such as C or C++, but are much safer, since you generally cannot access invalid data.

There are two kinds of references in the Nessa type system: 

* **Constant references:** they can be used to read the data that they point to, but you **cannot modify it** under any circumstances.
* **Mutable references:** The same as constant ones, but you are allowed to modify or even replace the underlying data.

Now, in order to pointt to something, you need to know *what* you are pointing to. This is done with other types. When you
want to create a constant reference that points to a value of type *T*, you use the type `&T`. In a similar way, you use `@T` for a 
mutable reference pointing to a *T*. You can also construct chained references such as `@&T`.

Using this rule, we could construct types such as `&Int` or `@String`, which refer to a constant reference to an `Int` and a mutable reference
to a `String`, respectively. In the next sections we will see how to create even more complex types.