Як передати масив у функцію

Масиви є однією з найбільш інтенсивно використовуваних форм структурованого зберігання даних в програмах для ЕОМ. Їх обробка може проводитися різними алгоритмами, реалізованими в методах класів і функціях. Відповідно, часто потрібно передати масив у функцію. Більшу свободу у виборі способів вчинення даної дії пропонують мови C і C ++.
Як передати масив у функцію




Вам знадобиться
  • - компілятори мов C і C ++.
Інструкція
1
Передайте в функцію масив фіксованого розміру. Прототип функції змініть таким чином, щоб він містив аргумент відповідного типу. Наприклад, декларація функції, приймаючої як параметр масив цілих числових значень з трьох елементів, може виглядати наступним чином:

void ArrayFunction (int aNumbers [3]) -


Виклик такої функції здійснюється шляхом передачі їй безпосередньо масиву як аргумент:

void SomeFunction ()
{
int aNumbers [] = {1, 2, 3} -
ArrayFunction (aNumbers) -
}


Передані дані копіюються в стек. Модифікація масиву в викликається функції не призводить до зміни джерела.


2
Передавайте в функцію масиви змінної довжини. Для цього просто не специфицируются розмірність відповідного аргументу:

void ArrayFunction (int aNumbers []) -


Багатовимірні масиви також можна передавати подібним чином (змінним може бути тільки перше «вимір»):

void ArrayFunction (int aNumbers [] [3] [2]) -


Виклик подібних функцій проводиться тим же чином, що і в першому кроці.

Для того щоб мати можливість коректно обробляти масиви змінної довжини у функції, необхідно або явно передавати кількість їх елементів через додатковий параметр, або використовувати угоди, що накладають обмеження на значення самих елементів (певне значення має бути ознакою кінця масиву).
3
Передайте масив за вказівником. Аргументом функції повинен бути покажчик на значення з типом, відповідним елементам масиву. Наприклад:

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]) - // починаючи з другого елементу
}


Даний спосіб також зазвичай передбачає передачу кількості доступних елементів у додатковому параметрі або використання ознаки кінця масиву.
4
Здійсніть передачу даних у функцію з параметром, що є об'єктом або посиланням на об'єкт класу, що реалізовує функціонал масиву. Подібні класи або шаблони класів зазвичай входять до складу популярних бібліотек і фреймворків (QVector в Qt, CArray в MFC, std :: vector в STL, і т.д.).

Часто дані класи реалізують стратегію неявного спільного використання даних (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) -
}


До того ж подібні класи зазвичай підтримують зручні можливості, такі як динамічна зміна розміру масиву, пошук, сортування і т.д.
Переглядів: 2667

Увага, тільки СЬОГОДНІ!