Вот пример того, как это сделать. Ключ использует typedef для установки вашего указателя на массив указателей, чтобы вы не запутались.
typedef int (*pint3)[A][B];
В этой строке мы устанавливаем тип, который указывает на двумерный массив указателей на int. 2D-массив имеет размеры, равные двум измерениям, которые вы изначально рассматривали.
Как уже упоминалось в комментариях, этот метод нарушает алиасинг. Этот тип переназначения указателей подвержен ошибкам, и его, вероятно, следует избегать.
#include <iostream>
int main() {
int A = 2;
int B = 2;
int C = 3;
int array[]{1, 1, 1, 1, 2, 2, 2,2, 3,3,3,3};
const int *const p = array;
typedef int (*pint3)[A][B];
auto threeDArray = (pint3) p;
std::cout << "Printing 3D array: " << std::endl;
for(int i = 0; i < C; i++ ) {
for(int j = 0; j < B; j++) {
for (int k = 0; k < A; k++) {
std::cout << threeDArray[i][j][k];
}
std::cout << std::endl;
}
std::cout << std::endl;
}
}
Выход:
Printing array:
11
11
22
22
33
33
Process finished with exit code 0