Мужики, чет запутался маленько... помогите осознать)
первая проблема:
определить так нельзя:
typedef struct _TYPE_A
{
   LPSTRUCT_B b;
} STRUCT_A, *LPSTRUCT_A;
typedef struct _TYPE_B
{
     LPSTRUCT_A a;
} STRUCT_B, *LPSTRUCT_B;
так:
typedef struct _TYPE_A
{
    struct _TYPE_B   *b;
} STRUCT_A;
typedef struct _TYPE_B
{
    struct _TYPE_A   *a;
} STRUCT_B;
 - будет правильно? или есть другие способы
и вторая проблема.
выделена область памяти: 
PVOID  buff;
мне надо сформировать указатель(PVOID) на некоторые ее элементы с шагом size_of_block = 1кб.
PVOID buff_i =  buff + i*size_of_block;
есествено, компилятор ругается (хотя что тут непонятного?

 сложить два числа)
напрашивается написать:
PVOID buff_i =  (PVOID) ( (DWORD)buff + i*size_of_block);
или
PVOID buff_i =  (PCHAR)buff + i*size_of_block;
но вот насколько это корректно? первая запись мне не нравится. вторая почему то тоже. 
как вообще принято делать? и возможные проблемы на x64? (за выравниванием на границу 4к я слежу при выделении памяти)
и чем последнее будет отличатся от 
PVOID buff_i =  (PWORD)buff + i*size_of_block;
PVOID buff_i =  (PDWORD)buff + i*size_of_block;
?