Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Основы.doc
Скачиваний:
48
Добавлен:
07.03.2016
Размер:
3.6 Mб
Скачать

9.4. Передача масивів в якості параметрів функцій

При використанні в якості параметру масиву у функцію передається вказівка на його перший елемент, іншими словами, масив завжди передається за адресою. При цьому інформація про кількість елементів масиву втрачається, і слід передавати його розмірність через окремий параметр.

Приведемо приклад обчислення добутку елементів масиву з використанням функції.

#include <iostream>

using namespace std;

double proizv(int* mas,int n);

//double proizv(int mas[],int n);

void main()

{

int mas[4] = {1,2,3,4};

cout<<proizv(mas,4); //24

}

double proizv(int* mas,int n)

//double proizv(int mas[],int n)

{

double p = 1;

for(int i=0;i<n;i++)

p*=mas[i];

return p;

}

Запис int* mas при передачі масиву у функцію еквівалентний запису int mas[] та означає вказівку на перший елемент масиву.

При передачі багатовимірних масивів всі розмірності, якщо вони не відомі на етапі компіляції, повинні передаватися в якості параметрів.

Наступний приклад показує роботу з двовимірним масивом як з вказівкою int (*mas)[3].

#include <iostream>

using namespace std;

void vivod(int (*mas)[3], int m, int n)

//void vivod(int mas[][3], int m, int n)

{

int i,j;

for(i=0;i<m;i++)

{

for(j=0;j<n;j++)

cout<<mas[i][j]<<" ";

cout<<"\n";

}

}

void main()

{

int mas[3][3]=

{

{11,12,13},

{21,22,23},

{31,32,33}

};

int(*m)[3]= mas;

vivod(++m, 2, 3);

}

По суті, двовимірний масив є вказівкою int(*m)[3]. Це означає, що при арифметичних операціях з вказівкою, вона збільшується або зменшується на кількість байтів трьох елементів типу даних int до першого розмикання. Після першого розмикання адреса збільшується на кількість байтів одного елементу int, як у разі звичайної вказівки. У даному прикладі вказівці int(*m)[3] привласнюється значення вказівки двовимірного масиву mas. Потім, у функцію vivod передається вказівка m збільшена на одиницю. Функція vivod набуває значення вказівки та виводить другий і третій рядки масиву:

21 22 23

31 32 33

При передачі у функцію записи int (*mas)[3] та int mas[][3] еквівалентні. Другий параметр у дужках вказувати обов’язково, саме він говорить на скільки елементів масиву треба зміщуватись при виконанні арифметичних операцій.

Можна передати двовимірний масив у функцію як подвійну вказівку ("**").

Приклад.

#include <iostream>

using namespace std;

void vivod(int **mas, int m, int n)

{

int i,j;

for(i=0;i<m;i++)

{

for(j=0;j<n;j++)

cout<<mas[i][j]<<" ";

cout<<"\n";

}

}

void main()

{

//m, n - відповідно кількість рядків

// і стовпців масиву

int i, j, m, n;

cin>>m>>n;

//Ініціалізація динамічного масиву

int **mas = new int*[m];

for (i=0;i<m;i++)

mas[i]= new int[n];

//Введення даних

for(i=0;i<m;i++)

for(j=0;j<n;j++)

cin>>mas[i][j];

//Виведення даних

vivod(mas, m, n);

//Видалення динамічного масиву

for (i=0;i<m;i++)

delete[] mas[i];

delete [] mas;

}

Спочатку оголошується змінна типу «вказівка на вказівку на int» і виділяється пам'ять під масив вказівок на рядки масиву (кількість рядків – m). Потім організовується цикл для виділення пам'яті під кожен рядок масиву. Кожному елементу масиву вказівок на рядки привласнюється адреса початку ділянки пам'яті, виділеної під рядок двовимірного масиву. Кожен рядок складається з n елементів типу int. Звільнення пам'яті двовимірного масиву також відбувається в два етапи. Спочатку в циклі видаляються m динамічних рядків, кожен з яких є вказівкою на одновимірний масив. Потім видаляється сам масив вказівок на рядки.