Вдохновленный this quiestion.Почему размерный размерный массив, передаваемый функции, требует своего размера?
Почему -
void display(int p[][SIZE]) // allowed
и
void display(int p[][]) // not allowed
?
Вдохновленный this quiestion.Почему размерный размерный массив, передаваемый функции, требует своего размера?
Почему -
void display(int p[][SIZE]) // allowed
и
void display(int p[][]) // not allowed
?
Потому что массивы распад указателям при передаче функции. Если вы не обеспечиваете мощность второго измерения массива, компилятор не знает, как разыменовать этот указатель.
Вот более пространное объяснение: когда вы пишете это
p[index]
компилятор выполняет некоторые арифметические операции над указателями, чтобы найти адрес элемента, который он должен ссылаться: он умножает index
размером p
-х элемент, и добавляет его к базовому адресу p
:
address = <base address of p> + index * <size of p's element>
При попытке передачи массива, как это, p[][]
, компилятор знает только базовый адрес p
, но не размер его элемента. Для того, чтобы компилятор знал размер элемента p
, вам необходимо предоставить мощность второго измерения.
Поскольку 2D-массив хранится в строке мудрый, и поэтому функции требуется количество столбцов, чтобы он знал, когда начинается следующая строка.
Это потому, что это требует такуляции в указателях. когда р указывает на массив 2 х мерном, что это размер SIZE
эта операция p+=3
рассчитывается следующим образом:
, если величина р является константой, равной ADRESS р получить это значение ADRESS + 3 * Размер.
Это потому, что арифмитическое в указателях отличается от арифметических в действительных числах. Этот расчет не может быть выполнен без знания размера массива.
Поскольку массив не является указателем, а массив массивов не является указателем на указатель. –