КАТЕГОРИИ:
АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника
|
Передача масивів в якості параметрів функцій
При використанні в якості параметру масиву у функцію передається вказівка на його перший елемент, іншими словами, масив завжди передається за адресою. При цьому інформація про кількість елементів масиву втрачається, і слід передавати його розмірність через окремий параметр. Приведемо приклад обчислення добутку елементів масиву з використанням функції.
#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);
|