Если вы используете среду компиляции static-threads, более краткий способ объявить ваш массив будет выглядеть примерно так:
#define SIZE 10000
shared [*] int table [ SIZE ]; /* data automatically blocked across THREADS */
shared [1] int *base = (shared [1] int *)&table;
Затем вы можете использовать циклический базовый указатель для создания указателя на общий ресурс, ссылающегося на данные со сродством к потоку X с помощью выражения:
shared [] int *threadXdata = (shared [] int *)(base+X);
При таком подходе вам никогда не нужно создавать экземпляр хранилища для массива указателей THREADS. Однако, если вы действительно этого хотите, вы можете объявить и инициализировать что-то вроде этого:
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*/
Здесь threadptr - это локальный массив указателей, служащий каталогом ссылок на данные каждого потока.
Обратите внимание, что все вышеперечисленное использует неограниченно блокируемый указатель на общий для доступа к элементам со сродством к одному потоку, поскольку каждый блок представляет собой один непрерывный кусок данных без переноса между потоками.