Сначала я предлагаю не использовать размер времени выполнения для массива в C / C ++, за исключением того, что вы используете вектор STL в качестве массива. поэтому вместо:
int i = 5;
вы должны использовать:
const int i = 5;
, за исключением того, что вы используете Vector, который безопасен и лучше, чем массивы intrinsi c.
как я могу привести указатель void на 2d-массив (массив указателей на массивы int), когда я не знаю размер массива во время компиляции? Это как-то возможно?
Если говорить о массиве C intrinsi c, это невозможно!
почему нельзя? потому что компилятор C / C ++ не знает вашего размера массива, границ и т. д., поэтому, если вы преобразуете свой 2d-массив в 1d-массив, это возможно. это причина того, что массив tab2 может получить доступ к первому 5-му элементу вашего массива. на самом деле компилятор C / C ++ не может отличить guish от
int a[3][3]
от
int a[3*3]
, поэтому вы должны знать хотя бы об одном измерении вашего массива:
int main() {
const int i = 3,j = 4;
int tab1[i][j] = {1,2,3,4,5,6,7,8,9,10,11};
//cast to void pointer
void *p = (void *)tab1;
auto a = (int (*)[i][12/i])p;
return 0;
}
В приведенном выше примере мне известно о i и общем количестве ( 12 ), и я вычисляю второе измерение. Я использую ключевое слово auto, которое очень легко определяет тип данных.