Вам понадобится
- - компиляторы языков C и C++.
Инструкция
1
Передайте в функцию массив фиксированного размера. Прототип функции измените таким образом, чтобы он содержал аргумент соответствующего типа. Например, декларация функции, принимающей в качестве параметра массив целых числовых значений из трех элементов, может выглядеть следующим образом:
void ArrayFunction(int aNumbers[3]);
Вызов такой функции осуществляется путем передачи ей непосредственно массива в качестве аргумента:
void SomeFunction()
{
int aNumbers[] = { 1, 2, 3 };
ArrayFunction(aNumbers);
}
Передаваемые данные копируются в стек. Модификация массива в вызываемой функции не приводит к изменению источника.
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]);
Вызов подобных функций производится тем же образом, что и в первом шаге.
Для того чтобы иметь возможность корректно обрабатывать массивы переменной длины в функции, необходимо либо явно передавать количество их элементов через дополнительный параметр, либо использовать соглашения, накладывающие ограничения на значения самих элементов (определенное значение должно являться признаком конца массива).
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]); // начиная со второго элемента
}
Данный способ также обычно предполагает передачу количества доступных элементов в дополнительном параметре или использование признака конца массива.
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
Часто данные классы реализуют стратегию неявного совместного использования данных (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