Basically you asking what is the difference between an object and a pointer to an object?
Object is a region of storage. A pointer is just a an integer pointing an offset in this storage. A pointer physically (after making a binary out of code) does not differ from an object of one type to an object of another type - always an integer. On the other hand, object is a region that has an offset and a size. That two basic matters that C++ distinguishes.
Why can you do this padd = (Addition*) &d; but not this padd = (Addition) &d;?
Like it is said above all pointers are physically the same (i.e. integers). That is why it is always possible to do the former. Mind that at the end dereferencing this pointer is undefined behavior. However it does not seem feasible for the compiler to convert to different matters (pointer to storage).
When declaring an object of Addition like Addition padd instead of Addition* padd, why does it ask for a constructor, which it doesn't when declaring a pointer?
Again pointer is just an integer, you do not need anything else to create it. However, Addition
is a storage shat is type that has no default constructor that is why you have to provide other objects to initialize it.
By the way, pointers are also object, that is why you can have a pointer to a pointer and etc.
In addition:
Pointers to void
, objects, functions are very different from pointers to members;
Pointers to void
, objects, functions must not be assumed to have a fixed size, size might be varying on some platforms, compilers, but not larger than void*
.