Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Передача массивов в функцию
Параметрами функции могут быть массивы, и функции могут возвращать указатель на массив в качестве результата. При использовании массивов в качестве параметров в функцию передается указатель на его первый элемент, т.е. массив всегда передается по адресу. При этом информация о количестве элементов теряется, поэтому следует передавать размерность массива как дополнительный параметр. Рассмотрим пример функции, формирующей вектор, состоящий из максимальных элементов двух исходных векторов.
#include " stdafx.h" #include < iostream>
using namespace std;
//функция формирует вектор(одномерный массив), //состоящий из максимальных элементов исходных массивов //массивы передаются через указатели void max_vect(int n, int *x, int *y, int *z) { for (int i=0; i< n; i++) z[i] = (x[i]> y[i])? x[i]: y[i]; }
void main() { setlocale(LC_ALL, " Russian");
//определим размерность массива const int N=7;
int a[N]={1, 4, 3, -1, 5, 6, 1}; int b[N]={7, 6, -2, 4, 3, 2, 4}; int c[N];
//получим вектор, состоящий из максимальных элементов //исходных массивов max_vect(N, a, b, c);
//выведем на экран элементы массива for (int i=0; i < N; i++) cout < < " \t" < < c[i]; }
Результат:
7 6 3 4 5 6 4
При передаче многомерных массивов, все размерности, если они не известны на этапе компиляции, должны передаваться в качестве параметров. Внутри функции массив интерпретируется как одномерный, а его индекс пересчитывается в программе. Рассмотрим пример нахождения суммы элементов двумерного массива.
#include " stdafx.h" #include < iostream>
using namespace std;
int sum(int *x, const int n, const int m) { int s = 0; for (int i=0; i < n; i++) for (int j=0; j < m; j++) //здесь производится пересчет индекса массива: //перемещение на одну строчку вниз //эквивалентно прибавлению длинны строки //поэтому x[i*m + j] и x[i][j] будут определять //один и тот же элемент s += x[i*m + j]; return s; }
void main() { setlocale(LC_ALL, " Russian");
int a[2][2]={{1, 2}, {3, 4}}; //имя массива a напрямую передавать нельзя из-за несоответствия типов //поэтому используется конструкция & a[0][0] cout < < sum(& a[0][0], 2, 2); }
Для работы с двумерным массивом естественным образом необходимо применить альтернативный способ выделения памяти под массив. При этом память выделяется в два этапа: сначала под столбец указателей на строки матрицы, а затем в цикле под каждую строку. Освобождение памяти должно выполняться в обратном порядке. Рассмотрим предыдущий пример, но с использованием описанного метода.
#include " stdafx.h" #include < iostream> #include < stdlib.h>
using namespace std;
int sum(int **x, const int n, const int m) { int s = 0; for (int i=0; i < n; i++) for (int j=0; j < m; j++) s += x[i][j]; return s; }
void main() { setlocale(LC_ALL, " Russian");
const int N=4, M=3; //создаем одномерный массив указателей размером N элементов //(то что это массив указывают квадратные скобки, а то что указателей -*) int **a = new int* [N];
for(int i=0; i < N; i++) //динамически создаем одномерный массив размерностью M //и присваиваем его адрес элементу массива указателей a[i] = new int[M];
//заполним массив случайными числами и выведем его на экран for(int i=0; i < N; i++) { for(int j=0; j < M; j++) { //путем получения остатка (%) зададим числа в диапазоне от 0 до 9 a[i][j] = rand()%10; //здесь по индексу i выбирается указатель на одномерный массив //а индексу j - элемент в этом массиве cout < < a[i][j] < < " \t"; } cout < < endl; }
cout < < sum(a, N, M);
//освобождаем выделенную память в обратном порядке for(int i=0; i < N; i++) //сначала удаляем одномерные массивы delete [] (a[i]);
//а затем и сам массив указателей delete [] a;
}
Схема получившегося массива представлена на рисунке 8.1. Рисунок 8.1 – Схема двумерного массива для передачи в функцию
Контрольные вопросы 1. Как выглядит определение функции? 2. Как выглядит объявление функции? 3. Что такое формальный параметр? 4. Что такое фактический параметр? 5. Как осуществляется вызов функции? 6. Как осуществляется передача параметров в функцию? 7. Что такое inline-функция? 8. Как описать функцию, не возвращающую значения? 9. В чем разница передачи параметров по значению от передачи параметров по адресу? 10. Как передать параметр по ссылке? 11. Как передать параметр через указатель? 12. Как задать значения параметра по умолчанию? 13. Как передать массив в функцию? 14. Как передать многомерный массив в функцию?
|