A reference pointer represents indirection, just like a pointer does. However, a reference pointer can never be NULL . Because a reference pointer can't be NULL , you can always dereference a reference pointer. That is, data returned from the server is written into existing storage specified by the value of the reference pointer before the call. If you don't specify a pointer attribute to pointers in your method calls in your IDL, and no default attribute is specified for a top-level pointer parameter, it's treated as a reference pointer.
Unique pointers are a hybrid of full pointers and reference pointers.
Similar to full pointers, unique pointers can be NULL and can change in value. However, they are similar to reference pointers because the data pointed to is unique and is not accessible through any other parameters in the method call. That is, unique pointers don't cause aliasing. By indicating that aliasing can't occur, the remoting layer can assume the data pointed to is unique. This can save a significant amount of processing.