An object is simply a piece of memory with a type (not necessarily class type). A pointer to an object contains the address to where the object is stored in memory. The type information is normally not stored inside the object but is handled by the compiler at compile time. The compiler knows that an int* points to an int so when you dereference an int* it knows that it should interpret the memory that the pointer points to as an int. Dereferencing in itself doesn't really do anything. It's just the syntax that you have to use in order to access the object that the pointer points to. What really happens depends on what operations you perform on the object.