An array reference is pretty simple.
Lets say that B is the base address of the array (the starting address), S is the size of an element and I0 is an index into an array.
In the case of a one dimensional array, the address of an element is:
B + (S * I0)
You can extend this to multiple dimensions, but now you need to know the other dimensions of the array. Lets say you have a two dimensional array with dimensions D1, D0, and indices I0, I1 the address of an element is:
B + (D1 * I1 * S) + (S * I0)
A three dimensional array would be
B + (D2 * I2) * (D1 * I1 * S) + (S * I0)
and so on.
In the case of your void pointer, for a two dimensional array of int:
int D1 = 10, D0 = 20, I1 = 5, I0 = 5;
void * base;
base = malloc((D1 * D0) * sizeof(int));
int value = *((char*)base + (D1 * I1 * sizeof(int)) + (sizeof(int) * I0));
Note that I had to cast the void pointer to char* so that pointer arithmetic would be done in sizeof() units.
Even though this might be general, I don't think I'd use it much ;-) It does help to understand how array indexing works, though.