Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Шпоры по инфе, лучше пересмотреть их!!!!.docx
Скачиваний:
4
Добавлен:
15.04.2019
Размер:
127.67 Кб
Скачать

6.Способы передать в функцию массивов. Привести примеры.

Передайте в функцию массив фиксированного размера. Прототип функции измените таким образом, чтобы он содержал аргумент соответствующего типа. Например, декларация функции, принимающей в качестве параметра массив целых числовых значений из трех элементов, может выглядеть следующим образом: 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 oArray[i] = i; ArrayFunction(oArray); } К тому же подобные классы обычно поддерживают удобные возможности, такие как динамическое изменение размера массива, поиск, сортировку и т.д.