Как правило, компилятор не отслеживает первое измерение аргумента / параметра массива.(Если это так, то это расширение того, что требует стандарт C, возможно, как часть функции, обеспечивающей проверку границ.) Фактически невозможно передать массив в качестве аргумента в C, и для подпрограммы невозможнообъявить массив как параметр.
Когда параметр функции объявляется как массив, он автоматически настраивается в качестве указателя, согласно C 2018 6.7.6.3 7:
Aобъявление параметра как «массива тип » должно быть скорректировано на «квалифицированный указатель на тип », где квалификаторы типа (если таковые имеются) - те, которые указаны в [
и]
деривации типа массива…
Когда массив задается в качестве аргумента функции, он автоматически преобразуется в указатель на свой первый элемент, согласно C 2018 6.3.2.1 3:
За исключением случаев, когда это операнд оператора sizeof
или унарный оператор &
, или строковый литерал, используемый для инициализации массива, выражение с типом "массив" тип"преобразуется в выражение с типом" указатель на тип", которое указывает на начальный элемент объекта массива…
Таким образом, массивникогда не передается в качестве аргумента и не принимается в качестве параметра.Передаются только указатели.
Реализации C никогда не требуется длина массива для обеспечения какого-либо стандартного поведения C.Предположим, например, что параметр объявлен как int x[3][4]
.Это автоматически настраивается на int (*x)[4]
.Затем, если код в функции использует x[i][j]
, реализация C должна найти этот элемент в памяти.Это i*4+j
элементов за пределами x
точек.Реализация нуждается во втором измерении, чтобы выполнить вычисление, потому что оно должно увеличиваться на i
подмассивов, чтобы найти элемент x[i][j]
.Так как он увеличивается на подмассивы, ему нужно знать, насколько велики подмассивы.
Однако реализация C не должна знать, насколько велик массив.Никакое выражение не потребует от него использования размера массива.Поэтому достаточно иметь указатель на первый элемент массива.