Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

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

Поиск

Чтобы передать массив в качестве аргумента в функцию, указывается имя массива без каких-либо квадратных скобок, часто передаётся в качестве параметра размерность массива, чтобы функция могла обработать заданное число элементов в массиве. Имя массива является адресом первого элемента массива в памяти, поэтому когда вызываемая функция модифицирует элементы массива в теле функции, она модифицирует реальные элементы массива в их истинных ячейках памяти. Если массив объявлен следующим образом: int ara[24];, то

modifyArray(ara, 24); //вызов функции и передача имени и размерности массива;

void modifyArray(int b[ ], int n) // заголовок функции

void modifyArray(int [ ], int); //прототип функции

Рассмотрим пример передачи массива в качестве параметра функции, модифицирующей его:

#include <iostream.h>

#include<iomanip.h>

void modifyArray(int[ ],int); //прототип функции

void main()

{

const int arraySize=5;

int i, a[arraySize]={0,1,2,3,4};

cout<<”Печать массива”<<endl;

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

cout<<setw(3)<<a[i];

cout<<endl;

modifyArray(a, arraySize); // вызов функции

cout<<”Значения изменённого массива”<<endl;

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

cout<<setw(3)<<a[i];

cout<<endl;

return 0;

}

void modifyArray(int b[ ], int n) // заголовок функции

{

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

b[j]*=2;

return 0;

}

В программах возможна ситуация, когда функции нельзя позволять модифицировать элементы массива. Для этой цели С++ имеет спецификатор типа const для предотвращения изменения значений в массиве. В этом случае элементы массива в теле функции становятся постоянными, и попытки изменить их приводят к ошибке при трансляции.

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

#define MAX 10

#include <iostream.h>

#include<time.h>

#include<stdlib.h>

 

//прототипы функций

void fill_array(int ara[]); // заполнение массива случайными числами

void print_array(int ara[]); // печать массива

void sort_array(int ara[]); // сортировка массива

 

void main()

{

int ara[MAX];

fill_array(ara);

cout<<"печать массива"<<endl;

print_array(ara);

sort_array(ara);

cout<<"печать отсортированного массива"<<endl;

print_array(ara);

}

// описание функций

void fill_array(int ara[MAX])

{

int ctr;

randomize();

for (ctr=0; ctr<MAX; ctr++)

ara[ctr]=(rand()%100);

return;

}

void print_array(int ara[MAX]) //вывод массива

{

int ctr;

for (ctr=0; ctr<MAX; ctr++)

cout<<ara[ctr]<<" ";

cout<<"\n";

return;

}

void sort_array(int ara[MAX])

{

int temp;

int ctr1,ctr2;

for (ctr1=0; ctr1<MAX-1; ctr1++)

for (ctr2=ctr1+1; ctr2<MAX; ctr2++)

if (ara[ctr1]>ara[ctr2])

{

// ara[ctr1]=ara[ctr1]^ara[ctr2];

//ara[ctr2]=ara[ctr1]^ara[ctr2];

//ara[ctr1]=ara[ctr1]^ara[ctr2];

ara[ctr1]^=ara[ctr2]^=ara[ctr1]^=ara[ctr2];

return 0;

}

/* {temp=ara[ctr1];

ara[ctr1]=ara[ctr2];

ara[ctr2]=temp;

}*/

return 0;

}

Передача по адресу данных - не массивов.

Иногда оказывается полезным передать по адресу параметры, но при этом надо помнить, что вызываемая функция может изменить значения переменных. Для передачи по адресу данных, не являющихся массивами нужно сделать следующее:

1. перед переменной в вызывающей функции поставить символ амперсант (&);

2. перед каждым использованием переменной в принимающей функции поставить символ звёздочка (*).

Рассмотрим пример передачи данных из main() в другую функцию.

#include <iostream.h>

void do_fun(int *amt); //прототип функции

void main()

{

int amt;

amt=100;

cout<<”В main amt=”<<amt<<”\n”;

do_fun(&amt); // вызов функции, & означает, что передача по адресу

cout<<”После возврата amt =”<<amt;

return0;

}

void do_fun(int *amt) // описание функции

{

*amt=85;

cout<<”Внутри функции do_fun amt=”<<*amt<<”\n”;

return 0;

}

В результате получим следующие строки:

В main() amt=100

Внутри функции do_fun() amt=85

После возврата amt=85



Поделиться:


Последнее изменение этой страницы: 2016-12-12; просмотров: 158; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.133.155.163 (0.006 с.)