1 is an object created on the heap (which is pointed to by the pointer c), where it'll remain until it's explicitly deleted (unless you're using some form of smart pointer or garbage collector addon).

2 is an object created on the stack which will remain until the scope in which it was created ends.

3 is not an object, and cannot be used as one (unless it's pointed at one). It's a pointer to an object, and can be pointed at something created by either of the first two methods. However, the scoping rules still apply to what it is pointed at.