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

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

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

Пример.
#include  
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  
#include  
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("Введите количество строк и столбцов: \n"); 
scanf("%d%d", &nstr, &nstb); 
а = (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  
int sum(int **a, const int nstr, const int nstb); 
int main(){ 
int nstr, nstb; 
cin >> nstr >> nstb; 
int **a, i, j; 
// Формирование матрицы a
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 t 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; 
}
Замечание. Память в примере выделяется в два этапа: сначала под столбец указателей на строки матрицы, а затем в цикле под каждую строку. Освобождение памяти должно выполняться в обратном порядке.
Онлайн всего: 2
Гостей: 2
Пользователей: 0

STUDLAB Сообщить про опечатку на сайте