Malloc returns a pointer to the first byte of the allocated memory, period. The only reference to subsequent elements is via pointer arithmetic and not via a conversion of a label representing an address to a pointer to that address. Perhaps you'd like to have a look at the pointer tutorial referenced in my signature.

In any event, one should use C++ if one is using C++. Writing C as C++ typically results in trash programming. The use of malloc over new is merely one small example. Explorations into a compiler's specific reaction to unspecified or undefined behavior is almost always time wasted. Such behavior often changes with the next version.