Как массив передается в функцию?

0

Рассмотрим следующее:

String[] array = {1,2,3,4};

myFunction(array);

public void myFunction(String[] array){
//some task here
}

Я должен был ответить на этот вопрос сегодня.

Как массивы передаются функции? Означает, какова основная методика?

Когда я не смог ответить, мне сказали следующее.

Адрес первого элемента передается, а другие последовательные элементы получаются из адреса первого элемента, добавляя несколько байтов.

Это происходит на каждом языке программирования или только с и c++?

Спасибо!

  • 1
    "Это происходит на каждом языке программирования?" Конечно, нет. Не все языки имеют функции и массивы. И ни C, ни C ++ не позволяют передавать массив функции; только указатель на первый элемент или (в C ++) ссылка на массив.
  • 0
    Массив выделяет последовательную область памяти, поэтому я думаю, что это возможно на языках, отличных от C / C ++.
Показать ещё 2 комментария
Теги:
arrays
memory-address

2 ответа

4
Лучший ответ

Нет, в Java, например, массивы - это объекты. Они передаются, как любой другой объект передается методу: метод будет ссылаться на объект массива в целом, а не на ссылку на первый элемент.

С этой страницы:

Все типы классов и массивов наследуют (§8.4.8) методы класса Object

Java не имеет понятия "указатели" в том же смысле, что и C или C++ (адреса в памяти), то есть ссылка на объект не указывает на место памяти, где хранится объект.

  • 2
    Красиво сказал Манути.
  • 0
    +1 Спасибо за ответ
Показать ещё 2 комментария
3

Теоретически каждый язык отличается. Однако:

  • В 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 по значению или по ссылке (но ссылка рекомендуется по соображениям производительности).

  • 0
    +1 Спасибо за объяснение

Ещё вопросы

Сообщество Overcoder
Наверх
Меню