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

Масиви є однією з найбільш інтенсивно використовуваних форм структурованого зберігання даних в програмах для ЕОМ. Їх обробка може проводитися різними алгоритмами, реалізованими в методах класів і функціях. Відповідно, часто потрібно передати масив у функцію. Більшу свободу у виборі способів скоєння даного дії пропонують мови 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 lt; 10 i ++)
oArray [i] = i;

ArrayFunction (oArray);
}


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



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


Оцініть, будь ласка статтю
Всього голосів: 136
Увага, тільки СЬОГОДНІ!