Nim isn't C++. Many C++ constructs don't have exact equivalents.
A T * in C++ can be a ref T (garbage-collected) or a ptr T (not garbage collected), except that neither supports pointer arithmetic out of the box. You can emulate pointer arithmetic, though. In general, however, you don't want to. The primary use of ptr T is for C interoperability and low-level hacks in conjunction with addr. If you want heap-allocated storage, ref T is generally the way to go.
To tell the compiler that you aren't going to modify a value, use let instead of var for local and global variables. Any parameters that are not passed by var and aren't/don't have ref or ptr types are implicitly constant (in that you can't mutate them). If something isn't behind a var, ref, or ptr, you generally can't mutate the value.
Complex values are already automatically passed by reference, so you typically don't need & for parameter passing. You can use the {.byref.} and {.bycopy.} pragmas to annotate a type accordingly. Procedures can return a var T if you need a reference to the result.
There is no equivalent to T &x for local variables. However, you can use template x: T = ... as a form of expression alias that can often be used for the same purpose.