![]() Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Передача массивов в качестве параметров
При использовании в качестве параметра массива в функцию передается указатель на его первый элемент, иными словами, массив всегда передается по адресу. При этом информация о количестве элементов массива теряется, и следует передавать его размерность через отдельный параметр (в случае массива символов, то есть строки, ее фактическую длину можно определить по положению нуль-символа): #include < iostream.h> int sum(const int* mas, const int n); int const n = 10; int main(){ int marks[n] = {3, 4, 5, 4, 4}; cout < < " Сумма элементов массива: " < < sum(marks, n); return 0; } int sum(const int* mas, const int n){ // варианты: int sum(int mas[], int n) // или int sum(int mas[n], int n) // (величина n должна быть константой) int s = 0; for (int i = 0; i< n; i++) s += mas[i]; return s; } При передаче многомерных массивов все размерности, если они не известны на этапе компиляции, должны передаваться в качестве параметров. Внутри функции массив интерпретируется как одномерный, а его индекс пересчитывается в программе. В приведенном ниже примере с помощью функции подсчитывается сумма элементов двух двумерных массивов. Размерность массива b известна на этане компиляции, под массив а память выделяется динамически: #include < stdio.h> #include < std1ib.h> int sum(const int *a, const int nstr, const int nstb); int main(){ int b[2][2] = {{2, 2}. {4, 3}}; printf(" Cyммa элементов b: %d\n", sum(& b[0][0], 2, 2)); // имя массива передавать в sum нельзя из-за несоответствия типов int i, j, nstr, nstb, *a; printf(" Bведитe количество строк и столбцов: \n"); scanf(" %d", & nstr, & nstb); a = (int *)malloc(nstr * nstb * sizeof(int)); for (i = 0; i< nstr; i++) for (j - 0; j< nstb; j++)scanf(" *d", & a[i * nstb + j]); printf(" Cyммa элементов a: %d\n", sum(a, nstr, nstb)); return 0; } int sum(const int *a, const int nstr, const int nstb){ int i, j, s = 0; for (i = 0; i< nstr; i++) for (j = 0; j< nstb; j++)s += a[i * nstb + j]; return s; } Для того чтобы работать с двумерным массивом естественным образом, можно применить альтернативный способ выделения памяти: #include < iostream.h> int sum(int **a, const int nstr, const int nstb); int main(){ int nstr, nstb; cin > > nstr > > nstb; int **a, i, j; // Формирование матрицы а: a = new int* [nstr]; for (i = 0; i< nstr; i++) a[i] = new int [nstb]; for (i = 0; i< nstr; i++) for (j = 0; j< nstb; j++)cin > > a[i][j]; cout < < sum(a, nstr, nstb); return 0; } int sum(int **a, const int nstr, const int nstb){ int i, j, s = 0; for (i = 0; i< nstr; i++) for (j - 0; j< nstb; j++)s += a[i][j]; return s; } В этом случае память выделяется в два этапа: сначала под столбец указателей на строки матрицы, а затем в цикле под каждую строку, как показано на рис. 1.10. Освобождение памяти должно выполняться в обратном порядке.
|