As I understand you, you want to have m_ItemsOnCpu point at the beginning of m_Items, and m_ItemsOnGpu somewhere in the middle of m_Items.
I do not know exactly what you want to achieve by pointing to the Item pointers. You could use two separate Item* arrays for that. If they need to be consecutive in memory, this is automatically the case with class or struct members, although there might be a small gap in between due to struct member alignment, which you can set to 1 byte on most compilers, i.e. MSVS.
I figure you want const pointers so the user of your class cannot modify them (const pointer to pointer to Item, Item ** const m_ItemsOnCpu). This can be achieved by using a getter function instead of publicly exposing the member variables. Const objects need to be initialized and cannot be assigned to. Since the address of m_Items is determined at run time, I do not see a way to initialize const pointers.
Another possible goal would be that you would not want the user to modify the pointers found where m_ItemsOnCpu and m_ItemsOnCpu point (pointer to const pointer to Item, Item * const * m_ItemsOnCpu). Then you can initialize them pointing to appropriate places. A minimal example would be:
#define ON_CPU 5
#define ON_GPU 5
class Item {};
struct A {
A() {
m_Items[0] = 0; // initialize your array here
m_ItemsOnCpu = &(m_Items[0]);
m_ItemsOnGpu = &(m_Items[ON_CPU]);
};
Item * m_Items[ON_CPU + ON_GPU];
Item * const * m_ItemsOnCpu;
Item * const * m_ItemsOnGpu;
};
int main() {
}
I hope this helps.