Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Информатика. Часть 2.doc
Скачиваний:
60
Добавлен:
27.03.2015
Размер:
539.65 Кб
Скачать

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

Массивы могут быть параметрами функций, и функции могут возвращать указатель на массив в качестве результата.

Не надо путать размер массива и размерность массива. Размер массива – количество элементов, размерность массива – количество индексов. Например, mass[3][4][5] – трехмерный массив размером 345 = 60 элементов.

Для передачи в функцию одномерного массива достаточно передать адрес его нулевого элемента, носителем которого является само имя этого элемента, т. е. если х – имя массива, то выражения [0] и х эквиваленты. В качестве формального параметра в определении функции и в прототипе нужно использовать указатели на переменные соответствующего типа. Можно в этом качестве использовать и описание массива (без указания размера и без списка начальных значений). Например, необходимо написать и протестировать функцию, которая определяет произведение и сумму членов целочисленного одномерного массива.

Пример 4

#include <iostream>

#include <iomanip>

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.

В этом примере мы использовали все три способа передачи параметров в функцию: через указатель (ptmass), по значению (n→5) и с помощью ссылочных параметров, который мы обсудили выше.

Запись pt[i] следует понимать как взятие значения по адресу pt + i, т. е.

pt[i] == *(pt + i) или &pt[i] == pt + i.

Ничего в программе не изменится, если прототип и заголовок функции в определении записать следующим образом:

void fun(int pt[],int n,int &sum,int &pr).

Передача в функцию двумерного массива (матрицы)

Многомерный массив в соответствии с синтаксисом языка есть массив массивов, т. е. массив, элементами которого служат массивы. Например, двумерный массив

int mass[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 – номер столбца.