Рассмотрим следующее:
String[] array = {1,2,3,4};
myFunction(array);
public void myFunction(String[] array){
//some task here
}
Я должен был ответить на этот вопрос сегодня.
Как массивы передаются функции? Означает, какова основная методика?
Когда я не смог ответить, мне сказали следующее.
Адрес первого элемента передается, а другие последовательные элементы получаются из адреса первого элемента, добавляя несколько байтов.
Это происходит на каждом языке программирования или только с и c++?
Спасибо!
Нет, в Java, например, массивы - это объекты. Они передаются, как любой другой объект передается методу: метод будет ссылаться на объект массива в целом, а не на ссылку на первый элемент.
Все типы классов и массивов наследуют (§8.4.8) методы класса Object
Java не имеет понятия "указатели" в том же смысле, что и C или C++ (адреса в памяти), то есть ссылка на объект не указывает на место памяти, где хранится объект.
Теоретически каждый язык отличается. Однако:
В C функция не может принимать массив в качестве аргумента. Когда вы объявляете параметр массива, тип автоматически преобразуется в указатель, поэтому между void f( int a[5] )
и void f( int* )
нет никакого различия. (Это часто суммируется, говоря, что массивы не являются объектами первого класса.) По соображениям совместимости C C++ следует тем же правилам, но в C++ вы обычно не передавали массив как параметр, и если вы это сделали, вы передадите его по ссылке, где это преобразование в указатель не произойдет. (Ie void f( int (&a)[5] )
не совпадает с void f( int* &a )
.)
В Java и ряде других последних языков все объекты (или почти), включая массивы, являются объектами, а параметры, переменные и т.д. Являются указателями на эти объекты. Таким образом, в Java вы передаете указатель на массив, но полный объект массива со всей информацией о его размере и т.д. Подобным образом передается std::vector<int>*
в C++.
На многих языках (в основном старше?), Таких как Pascal и языках семейства Modula, а массив - это тип объекта, как и любой другой. Если вы не предпринимаете никаких конкретных действий, массив будет передаваться по значению с полной копией массива.
И на самых ранних языках, таких как Fortran или Algol, на каждом языке часто были свои собственные очень специфические способы передачи массивов, хотя в целом они придерживались тех же правил, что и другие типы. (Некоторые ранние языки, такие как Cobol или Basic, даже не поддерживали передачу аргументов функций, по крайней мере, в самых ранних вариантах.)
Среди языков, которые вы, вероятно, увидите сегодня, я думаю, что модель Java преобладает. C остается выбросом, а C++ дает вам выбор: вы можете передать std::vector
по значению или по ссылке (но ссылка рекомендуется по соображениям производительности).