Как передать массив в функцию?
Массивы являются одной из наиболее интенсивно используемых форм структурированного хранения данных в программах для ЭВМ. Их обработка может производиться различными алгоритмами, реализованными в методах классов и функциях. Соответственно, часто требуется передать массив в функцию. Большую свободу в выборе способов совершения данного действия предлагают языки 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]); // начиная со второго элемента}Данный способ также обычно предполагает передачу количества доступных элементов в дополнительном параметре или использование признака конца массива. Осуществите передачу данных в функцию с параметром, являющимся объектом или ссылкой на объект класса, реализующего функционал массива. Подобные классы или шаблоны классов обычно входят в состав популярных библиотек и фреймворков (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);}К тому же подобные классы обычно поддерживают удобные возможности, такие как динамическое изменение размера массива, поиск, сортировку и т.д.
Оцените статью!
Вам понадобится
- - компиляторы языков C и C++.