A stack is just a pseudo container in this case. In a real system the item would be popped and stored elsewhere by hand. For instance, because I used to write assembly, we used the stack to hold register values since we only had A and B to hold current data in. If you lost track of it, it would be "gone".
Without seeing his code I assume that the pop method is deleting the item from the stack and returning the reference to where it's located so you can manipulate/use it as needed.
Think of a Pringles can. If you pop the top chip off the stack it's just sitting there. It didn't get deleted or.have it's memory allocated over or zeroed out. Returning the pointer to it just says I've popped this item and removed it from the stack and here it is, do what you want if anything to it.
Another reason for returning a pointer would be in the case where you aren't returning a simple data type like an int or book; perhaps what's on your stack is a bunch of messages whose class contains 100 public/private variables.
Perhaps what is confusing you is how it's stored in memory. The stack is referencing objects in memory inherently. Meaning the first item is from address 0x250C, the next is 0x35FF, etc. They aren't sitting contiguously in memory inside of the stack. The stack is a pseudo container that is just referencing memory location in the system. It's just a convenient way for you, the programmer, to keep it all together.