Given this declaration:
int (*Arr)[8];
you can assign it the address of an int array of size 8:
int data[8];
Arr = &data;
You can modify data through Arr:
(*Arr)[i] = value;
Note the parentheses around *Arr. They're needed to dereference Arr before applying the index to it, since the index [] operator has a higher precedence.
An important thing to understand here is that data is not dynamically allocated. If you keep its address around after it has gone out of scope, you'll get a dangling pointer (a pointer that points to something that no longer exists.)
To dynamically allocate an array and assign it to Arr, you can use a typecast on the result of new as follows:
int (*Arr)[8] = reinterpret_cast<int(*)[8]>(new int[8]);
(A working example can be found on ideone.)
Of course it doesn't make much sense to do this in such a roundabout way, as you can instead just:
int* Arr = new int[8];
And of course you can use an std::vector instead and avoid manual memory management completely:
std::vector<int> Arr;
Which provides you with an array that grows on its own as needed.