Передача одномерных массивов в функцию
При передаче массива в функцию её параметр должен быть объявлен как указатель. Как раз это вариант чаще всего используется профессиональными программистами. В этом случае функция имеет следующий вид:
void vivod(int * num, int size){
for(int i = 0; i < size; i++)
cout<<num[i]<<' ';
cout<<endl;
}
Вызов функции в данном случае для массива mas[6] будет иметь следующий вид:
vivod(mas, 6);
В общем случае вызов функции имеет вид:
имя_функции (имя массива, размер массива);
Однако отдельный элемент массива, используемый в качестве аргумента функции, обрабатывается подобно обычной переменной.
Когда программа передаёт массив в функцию, C++ передаёт адрес памяти первого элемента этого массива. Используя переменную-указатель, функция может перемещаться по содержимому массива, просто увеличивая значение указателя.
Если массив используется в качестве аргумента функции, функции передаётся адрес массива (адрес элемента массива с нулевым индексом).
Следует понимать, что, так как функция получает адрес массива, то она может изменить реальное содержимое массива, используемого при вызове функции. Покажем это на следующем примере.
// Пример 8.2. Функции fun() изменяет массив, используемый
// при вызове функции.
#include <iostream>
using namespace std;
const int DIM = 20;
void fun(int * num, int size);
int main(){
int x[DIM], n;
cout<<"Vvedi n: "; cin>>n;
for(int i = 0; i < n; i++)
x[i] = i + 1;
for(int i = 0; i < n; i++)
cout<<x[i]<<' '; // 1 2 3 4 5
cout<<endl;
fun(x, n); // вызов функции fun()
for(int i = 0; i < n; i++)
cout<<x[i]<<' '; // 2 4 6 8 10
cout<<endl;
system("pause");
}
void fun(int * num, int size){
for(int i = 0; i < size; i++)
num[i] = num[i] * 2; // или num[i]*= 2;
cout<<endl;
}
// Пример 8.3. Дан одномерный целочисленный массив. Поменять
// местами минимальный и максимальный элементы массива.
// Основные этапы решения задачи (ввод массива, вывод массива,
// обработка массива) оформить в виде функций.
#include <iostream>
using namespace std;
void init(int*, int);
void display(int*, int);
void obmen(int*, int);
const int DIM = 20;
int main(){
int a[DIM], n;
cout<<"Vvedi n: "; cin>>n;
init(a, n); // вызов init()
cout<<"\n\tIsxodni massiv\n"; display(a, n); // вызов display()
obmen(a, n); // вызов obmen()
cout<<"\n\tRezult massiv\n"; display(a, n); // вызов display()
system("pause");
}
void init(int * a, int n){
srand(n);
int * p = a;
for(int i = 0; i < n ; i++)
p[i] = rand() % 20 - rand() % 10;
}
void display(int * a, int n){
for (int * p = a; p < a + n; p++)
cout<<*p<<' ';
cout<<endl;
}
void obmen (int * a, int n){
int imin = 0, imax = 0;
for(int i = 0; i < n ; i++){
if(*(a + i) < *(a + imin )) imin = i;
if(*(a + i) > *(a + imax )) imax = i;
}
int temp = a[imin]; a[imin] = a[imax];
a[imax] = temp;
}
// Пример 8.4. Дан одномерный массив целых чисел. Отсортировать
// массив по неубыванию. Массив и его размер ввести с клавиатуры.
// Основные этапы решения задачи оформить в виде функций.
#include <iostream>
using namespace std;
void init(int*, int);
void display(int*, int);
void sort (int*, int);
const int DIM = 50;
int main(){
int a[DIM], n;
cout<<"Vvedi n: "; cin>>n;
init(a, n);
cout<<"\n\tIsxodni massiv \n"; display(a, n);
sort(a, n);
cout<<"\n\tOtsortirrov. massiv\n"; display(a, n);
system("pause");
}
void init(int * p, int n){
srand(n);
for(int i = 0; i < n; i++)
p[i] = rand() % 20 - 10;
}
void display(int * p, int n){
for(int i = 0; i < n; i++)
cout<<p[i]<<' ';
cout<<endl;
}
void sort(int * p, int n){
for(int i =1; i < n ; i++)
for(int j = 0; j <n-i; j++)
if(p[j] > p[j+1]){
int x = p[j]; p[j] = p[j + 1]; p[j + 1] = x;
}
}