new always returns a pointer to the space allocated on the heap (otherwise, how are you going to address it?).
In the third snippet, you're not allocating a pointer. You're allocating an int. new is returning the address of the int that was allocated which is then assigned to the pointer *b.