- - компілятори мов C і C ++.
void ArrayFunction (int aNumbers [3]) -
Виклик такої функції здійснюється шляхом передачі їй безпосередньо масиву як аргумент:
void SomeFunction ()
{
int aNumbers [] = {1, 2, 3} -
ArrayFunction (aNumbers) -
}
Передані дані копіюються в стек. Модифікація масиву в викликається функції не призводить до зміни джерела.
void ArrayFunction (int aNumbers []) -
Багатовимірні масиви також можна передавати подібним чином (змінним може бути тільки перше «вимір»):
void ArrayFunction (int aNumbers [] [3] [2]) -
Виклик подібних функцій проводиться тим же чином, що і в першому кроці.
Для того щоб мати можливість коректно обробляти масиви змінної довжини у функції, необхідно або явно передавати кількість їх елементів через додатковий параметр, або використовувати угоди, що накладають обмеження на значення самих елементів (певне значення має бути ознакою кінця масиву).
void ArrayFunction (int * pNumbers) -
Доступ до даних у функції може здійснюватися як в нотації роботи з елементами масиву, так і за допомогою адресної арифметики:
void ArrayFunction (int * pNumbers)
{
pNumbers [0] = 10- // доступ до елементу 0
* (PNumbers + 1) = 20- // доступ до елементу 1
}
Будьте уважні! Оскільки в функцію передається не копія даних, а покажчик на них, модифікації буде підданий вихідний масив.
Перевагою даного методу є швидкість, економія обчислювальних ресурсів і певна гнучкість. Так, можна викликати цільову функцію, передавши їй покажчик на довільний елемент масиву:
void SomeFunction ()
{
int aNumbers [] = {1, 2, 3} -
ArrayFunction (aNumbers) - // весь масив
ArrayFunction (aNumbers [1]) - // починаючи з другого елементу
}
Даний спосіб також зазвичай передбачає передачу кількості доступних елементів у додатковому параметрі або використання ознаки кінця масиву.
Часто дані класи реалізують стратегію неявного спільного використання даних (implicit data sharing) з підрахунком посилань (reference counting), виконуючи глибоке копіювання тільки при модифікації даних (copy on write). Це дозволяє мінімізувати споживання обчислювальних ресурсів навіть у разі передачі об'єктів масивів за значенням через аргументи функцій і методів:
void ArrayFunction (QVector oArray)
{
int nItemCount = oArray.count () -
int nItem = oArray [0] -
}
void SomeFunction ()
{
QVector oArray (10) -
for (int i = 0- i < 10- i++)
oArray [i] = i-
ArrayFunction (oArray) -
}
До того ж подібні класи зазвичай підтримують зручні можливості, такі як динамічна зміна розміру масиву, пошук, сортування і т.д.