Мне нравятся рисунки.Они помогают мне «видеть» вещи
struct Metadata *baseMetadataPtr;
baseMetadataPtr = malloc(100 * sizeof *baseMetadataPtr);
С этим, и, предполагая линейную память (прямоугольники ниже) и игнорируя требования к пространству для различных объектов, мы имеем
|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|...|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|...
^^^^^^^ baseMetadataPtr
(of type (struct Metadata *))
******* ===========================>
|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|...|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|...
^^^^^^^ baseMetadataPtr ^^^^^^ ^^^^^^^ ^^^^^^^ ^^^^^ ^^ ...
(of type (struct Metadata *)) *baseMetadataPtr (struct Metadata)
*(baseMetadataPtr+1)
baseMetadataPtr[2]
И, увеличение на левой части
*baseMetadataPtr
|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|...
^^^ Message_ID (type (int))
^^^^^^^ Message_Len (type (size_t))
^^^^ ... other members, followed by another object of type (struct Metadata)