Як передати масив у функцію
Вам знадобиться
- - компілятори мов 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 lt; 10 i ++)
oArray [i] = i;
ArrayFunction (oArray);
}
До того ж подібні класи зазвичай підтримують зручні можливості, такі як динамічна зміна розміру масиву, пошук, сортування і т.д.