Как передать массив в функцию?

3 ноября 2014 г. Просмотров: 899 Инструкции
Массивы являются одной из наиболее интенсивно используемых форм структурированного хранения данных в программах для ЭВМ. Их обработка может производиться различными алгоритмами, реализованными в методах классов и функциях. Соответственно, часто требуется передать массив в функцию. Большую свободу в выборе способов совершения данного действия предлагают языки C и C++.

Вам понадобится

  • - компиляторы языков 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);}К тому же подобные классы обычно поддерживают удобные возможности, такие как динамическое изменение размера массива, поиск, сортировку и т.д.
  • Оцените статью!