в C# например, мы можем набрать array_name.length
Я не использую C#, но, если в подпрограмме вы можете получить длину массива созданная в другом месте, затем информация об этой длине должна была быть сохранена в памяти и передана вместе с массивом. Что-то должно было поместить эту длину в память, и, когда массив передавался в качестве аргумента, что-то должно было включать информацию больше, чем просто длину массива. Так что C# использует память и вычислительное время.
Следствием этого является то, что вы не имеете прямого контроля над компьютером. Вы не можете написать более простую и эффективную программу, если что-то передает дополнительную информацию. Это обязательно расточительно. Это нормально, если вы пишете программы в ситуациях, когда доступно много ресурсов.
C не прилагает дополнительных усилий. Когда передается массив, передается только его местоположение, и это все, что вам нужно для доступа к его элементам. Если конкретной подпрограмме требуется ее длина, вы можете передать ее вручную - это ваш выбор, когда вам это нужно, но у вас также есть возможность не тратить ресурсы, когда они вам не нужны. Вы можете писать более эффективные программы.
в двухмерных массивах, почему я должен указывать количество столбцов массива?
Если мы знаем, что arr
массив int
, мы знаем, что элемент arr[0]
находится в начале, arr[1]
сразу после этого, arr[2]
после этого и так далее. Чтобы использовать одномерный массив, нам нужно знать только то, где он начинается.
Если мы знаем, array
- это двумерный массив int
, мы знаем, что a[0][0]
находится в начало, arr[0][1]
- после этого и так далее, но мы не знаем, где arr[1][0]
. Это после некоторого числа элементов arr[0][i]
, но мы не знаем, сколько, если мы не знаем второе измерение. Следовательно, чтобы использовать двумерный массив, вы должны знать длину второго измерения. Это логическое требование, а не выбор.
Дополнение
Как правило, подпрограмме нужно знать только , какие элементы массива она должна использовать. Не нужно знать, сколько элементов в массиве.
Ситуации, в которых подпрограмме не требуется указывать длину массива, включают:
- Для вычисления длина строки в буфере, подпрограмма (например,
strlen
) должна только исследовать каждый байт в буфере, пока не найдет нулевой байт. Не нужно знать, насколько велик весь буфер. (Пример: программа создает буфер из 100 байтов. Она читает байты из терминала, пока не будет найдена новая строка. Пользователь вводит только 12 символов, а затем новую строку. Буфер заполнен 12 байтами и нулевым символом Подпрограмма, проверяющая строку, должна работать только с 13 байтами, а не с 100.) - Подпрограмма может работать с фиксированным числом элементов. Например, подпрограмма, помогающая в численном интегрировании, может одновременно принимать три значения функции, подгонять их под кривую и возвращать область под кривой. Основная подпрограмма может иметь целый массив значений функций, и она многократно вызывает подпрограмму для оценки различных точек в массиве, передавая подпрограмме указатель на местоположение для работы. В каждом вызове подпрограмме нужно только знать, что для данного адреса есть три значения. Ему не нужно знать, сколько в полном массиве.
- Подпрограмма может работать с одинаковым количеством элементов в нескольких массивах. Например, подпрограмма для выполнения дискретного преобразования Фурье может занять несколько элементов N для работы и четыре массива: один для ввода реальных компонентов, один для ввода мнимых компонентов, один для вывода реальных компонентов, и один для вывода мнимых компонентов. Для каждого из массивов процедура использует N элементов. Это число N необходимо передать в процедуру только в одном параметре. Было бы расточительно хранить его в нескольких местах, по одному для каждого массива.
Другое соображение состоит в том, что иногда мы передаем только часть массива в подпрограмму. Если у меня есть какая-то строка в буфере, я бы хотел, чтобы подпрограмма работала только с той частью этой строки, возможно, только с одним словом в проанализированной команде. Для этого я могу передать только указатель на начало этого слова и длину слова для работы. В этом случае подпрограмма не только не должна знать длину массива, она даже не должна знать, где начинается массив. Нужно только знать, над чем его просят работать. Было бы расточительно передавать любую другую информацию.