Assuming you are using the static-threads compilation environment, a more succinct way to declare your array would be something like this:
#define SIZE 10000
shared [*] int table [ SIZE ]; /* data automatically blocked across THREADS */
shared [1] int *base = (shared [1] int *)&table;
Then you can use the cyclic base pointer to create a pointer-to-shared referencing the data with affinity to thread X with an expression like:
shared [] int *threadXdata = (shared [] int *)(base+X);
With this approach you never need to instantiate storage for an array of THREADS pointers. However if you really want that you can certainly declare and initialize one with something like this:
shared [] int *threadptr[THREADS];
for (int i=0; i < THREADS; i++) threadptr[i] = (shared [] int *)(base+i);
...
threadptr[4][10] = 42; /* example access to element 10 on thread 4*/
Here threadptr is a local array of pointers serving as a directory of references to each thread's data.
Note all of the above use an indefinitely-blocked pointer-to-shared for accessing the elements with affinity to a single thread, since each block is logically one contiguous chunk of data with no wrapping across threads.