Вам понадобится
  • - компиляторы языков 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