2013-12-11 4 views
3

Вдохновленный this quiestion.Почему размерный размерный массив, передаваемый функции, требует своего размера?

Почему -

void display(int p[][SIZE]) // allowed 

и

void display(int p[][]) // not allowed 

?

+2

Поскольку массив не является указателем, а массив массивов не является указателем на указатель. –

ответ

6

Потому что массивы распад указателям при передаче функции. Если вы не обеспечиваете мощность второго измерения массива, компилятор не знает, как разыменовать этот указатель.

Вот более пространное объяснение: когда вы пишете это

p[index] 

компилятор выполняет некоторые арифметические операции над указателями, чтобы найти адрес элемента, который он должен ссылаться: он умножает index размером p-х элемент, и добавляет его к базовому адресу p:

address = <base address of p> + index * <size of p's element> 

При попытке передачи массива, как это, p[][], компилятор знает только базовый адрес p, но не размер его элемента. Для того, чтобы компилятор знал размер элемента p, вам необходимо предоставить мощность второго измерения.

2

Поскольку 2D-массив хранится в строке мудрый, и поэтому функции требуется количество столбцов, чтобы он знал, когда начинается следующая строка.

1

Это потому, что это требует такуляции в указателях. когда р указывает на массив 2 х мерном, что это размер SIZE эта операция p+=3 рассчитывается следующим образом:

, если величина р является константой, равной ADRESS р получить это значение ADRESS + 3 * Размер.

Это потому, что арифмитическое в указателях отличается от арифметических в действительных числах. Этот расчет не может быть выполнен без знания размера массива.

Смежные вопросы