Стилистически никаких отличий при использовании в функциях массивов практически нет, хотя и есть одна интересная деталь. Рассмотрим пример функции, возвращающей сумму элементов массива.
#include <iostream>
#include <conio>
using namespace std;
const int N=5; // размер массива (глобальная константа)
int summ(int mas[N]); // Вар.II: int summ(int mas[], int N)
int main() {
int arr[N]={3, 4, 5, 4, 4}; // arr[0]=2, arr[1]=4, arr[2]=5, ...
cout << "Summa elementov massiva: " << summ(arr); // Вар.II: summ(arr, N)
getch(); return 0; }
//---------------------------------------------------------------------------
int summ(int mas[N]) { // Вар.II: int summ(int mas[], int N)
int s=0;
for(int j=0; j<N; j++) s = s + mas[j];
return s;
}
Из данного примера видно, что при вызове функции в качестве аргумента используется только имя массива summ(arr). Это имя (в нашем случае arr) в действительности представляет собой адрес массива в памяти. Использование адресов для массивов-аргументов похоже на использование аргумента ссылки, при котором значения элементов массива не копируются в функцию. Вместо этого функция работает с оригинальным массивом, хотя ссылается на него используя другое имя. Такой механизм используется для массивов, потому что они могут быть очень большими и дублирование массива в каждую функцию отнимало бы много времени и пространства памяти.
Таким образом, массив всегда передаётся по адресу. При передаче по адресу в стек заносятся копии адресов аргументов, а функция осуществляет доступ к ячейкам памяти по этим адресам и может изменить исходные значения аргументов. Однако, необходимо понимать, что адрес – это не то же самое, что ссылка.
Лекция 7(9 стр.)