Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ГЛАВА 8 Указатели и массивы.doc
Скачиваний:
58
Добавлен:
29.02.2016
Размер:
142.85 Кб
Скачать

Передача одномерных массивов в функцию

При передаче массива в функцию её параметр должен быть объявлен как указатель. Как раз это вариант чаще всего используется профессиональными программистами. В этом случае функция имеет следующий вид:

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;

}

}