Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Передача массивов в качестве параметров






При использовании в качестве параметра массива в функцию передается указатель на его первый элемент, иными словами, массив всегда передается по адресу. При этом информация о количестве элементов массива теряется, и следует передавать его размерность через отдельный параметр (в случае массива символов, то есть строки, ее фактическую длину можно определить по положению нуль-символа):

#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. Освобождение памяти должно выполняться в обратном порядке.






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.