using namespace std;
//Прототип функции
void fun(int *pt,int n,int &sum,int &pr);
void main ()
{ setlocale(LC_ALL,"rus_rus.1251");
int mass[5]={1,2,3,4,5},s,p;
fun(mass,5,s,p);
cout<<"Сумма и произведения равны: "
<<setw(3)<<s<<setw(5)<<p<<endl;
}
// Определение функции
void fun(int *pt,int n,int &sum,int &pr)
{ int i; sum=0, pr=1;
for(i = 0; i<n; i++)
{
pr*= pt[i];
sum+=pt[i];
}
}
Результат
Сумма и произведения равны: 5 120
Функция fun имеет четыре формальных параметра: pt – указатель на переменную такого же типа, что и обрабатываемый массив mass[], n – количество элементов массива, sum, pr – сумма и произведение элементов массива. Причем и sumи prявляются ссылочными параметрами, при обращении к функции fun() в них автоматически передаются адреса переменных s и p. Поэтому операции над sum иprизменяют фактические параметры s и p.
В этом примере мы использовали все три способа передачи параметров в функцию: через указатель (pt→mass), по значению (n→5) и с помощью ссылочных параметров, который мы обсудили выше.
Запись pt[i]следует понимать как взятие значения по адресу pt + i, т. е.
pt[i]== *(pt + i)или &pt[i] == pt + i.
Ничего в программе не изменится, если прототип и заголовок функции в определении записать следующим образом:
void fun(int pt[],int n,int &sum,int &pr).
Многомерный массив в соответствии с синтаксисом языка есть массив массивов, т. е. массив, элементами которого служат массивы. Например, двумерный массив
intmass[4][3]
состоит из четырех элементов, каждый из которых – одномерный массив из трех элементов. Как и в случае одномерных массивов, доступ к элементам многомерных массивов возможен с помощью индексированных переменных и с помощью указателей. Необходимо помнить, что при добавлении целой величины к указателю его внутреннее значение изменится на «длину» элемента соответствующего типа. Для приведенного массива mass – указатель, поставленный в соответствие элементу типа int[3]. Добавление единицы к указателю mass приводит к изменению значения адреса на величину
sizeof(int)*3== 6 байт
Именно поэтому *(mass + 1) есть адрес элемента mass[1], т. е. указатель на одномерный массив, состоящий из трех элементов и отстоящий от начала массива на 6 байт. Если рассматривать двумерный массив как матрицу, то mass[0] – это адрес нулевой строки (ее первого байта) матрицы, mass[1] – адрес первой строки и т. д.
Для передачи в функцию двумерного массива достаточно передать адрес его начала в виде mass[0] и его размеры (n и m – количество строк и столбцов), т. е. фактически вместо работы с двумерным массивом мы будем работать с одномерными массивами – строками матрицы, где n – количество этих одномерных массивов, m – их размер, а mass[i] – адреса. Тогда для передачи массива в качестве формального параметра можно использовать указатель на переменную такого же типа, что и массив.
Значит, если int *pt – формальный параметр, которому при обращении к функции передается адрес начала массива mass[0], то доступ к любому элементу двумерного массива в теле функции осуществляется согласно выражению
*(pt + i*m + j) == pt[i*m + j], где i – номер строки, j – номер столбца.
Перегруженные функции обычно используются для выполнения сходных операций над различными типами данных.
Предположим, вам требуется написать функцию, которая определяет максимальное значение в одномерном массиве типа double. Прототип этой функции будет иметь вид
double maxdouble (double *x, int len);
Затем возникает аналогичная задача, но для массива типа int. Вы создаете другую функцию, похожую на первую, с прототипом
int maxint(int *x, int len);
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.