Динамический массив указателей на статические массивы. В чём смысл?
Есть вот такой фрагмент кода:
int m = 100;
int n = 200;
int (*a)[n] = new int [m][n];
Компилятор говорит, что только первое измерение может иметь динамический размер, т.е. n
должна быть const
.
Окей, допустим.
Но в чём тогда смысл статичности второго измерения? Ведь компилятору неизвестно, какой будет размер первого измерения, для чего тогда знать размер второго?
Я, кажется, не до конца понимаю эту "статичность". Для меня это просто предварительное выделение места в памяти, которое должно быть однозначным и не может меняться.
Если подобный вопрос уже был, извиняюсь. Несколько часов пытался сам найти.
Ответы (1 шт):
int (*a)[n] = new int [m][n];
- как видите, все размеры кроме первого попадают в тип. Поэтому именно они должны быть фиксированными.
В С++ все типы фиксируются во время компиляции. В C такого ограничения нет (в С это разрешено в C99, но начиная с C11 компиляторам разрешили это не поддерживать - видимо потому что MSVC так и не осилили это сделать).
На самом деле, это хорошее ограничение, потому что иначе язык сильно усложняется.
Например:
int x = 10;
int (*a)[x] = ....;
x = 20;
Что здесь должно произойти? В C здесь a
создает вместе с собой скрытую переменную, чтобы сохранить текущее значение x
.
Зачем ее хранить? Потому что когда вы делаете a[i]
, i
умножается на sizeof
типа элемента массива (здесь - int[x]
), а этот размер зависит от x
.