Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lekcija-12.pdf
Скачиваний:
26
Добавлен:
10.02.2016
Размер:
367.6 Кб
Скачать

 

 

p

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

a

 

 

0

 

1

2

 

3

4

 

 

*++*pp;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

printf("%d

%d

%d\n", pp-p, *pp-a, **pp);

// 1,

2,

2

 

 

 

 

 

 

 

 

 

 

 

pp

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

p

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

a

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0

 

1

 

2

 

 

3

4

++**pp;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

printf("%d

%d

%d\n", pp-p, *pp-a, **pp);

// 1,

2,

3

 

 

 

 

 

 

 

 

 

 

 

pp

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

p

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

a

 

0

 

 

1

 

3

 

3

4

 

 

_getch();

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

return 0;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

Правила передачи одномерного массива в качестве параметра функции одинаковы:

независимо от того, является ли массив для функции входным, выходным или одновременно входным и выходным (передается в функцию, преобразуется в ней и возвращается в вызывающую функцию), в функцию всегда передается адрес массива; поэтому изменение массива в вызываемой функции приводит к изменению массива-

аргумента в вызывающей функции; никакого ссылочного типа для возврата массива

из функции не требуется;

использование имени массива и указателя на массив в качестве аргумента функции эквивалентны (в функцию передается адрес);

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

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

Программирование – лекция 12 (лекции Стрикелевой Л.В.)

10

o имя массива (например, А – адрес начала массива) или &A[0] (адрес первого элемента);

oа также может указываться:

размер массива;

количество обрабатываемых элементов

в заголовке функции указываются:

oтип элементов массива, его имя, а также:

размер массива (например, int x[5];) или

пустые квадратные скобки (например, int x[];) или

указатель на базовый тип (например, int *x);

в теле функции доступ к элементам массива осуществляется обычным способом:

oa[i] или *(a+i) или через указатель-переменную, проинициализированную именем массива.

Способы передачи одномерного массива в качестве параметра

const int n=7;

void myfunc(int a[n]); //C-стиль void myfunc(int a[]);

void myfunc(int *a);

Рассмотрим способы передачи одномерного массива в качестве параметра функции на примере вычисления суммы элементов массива.

//способ 1 с указанием размера массива

const int n=7; //размер массива - глобальная константа, видима везде

int add (int (&ar)[n]); //массив передается как ссылка //которую можно не указывать

int main()

{

static int iarray[n] = {5, 1, 6, 20, 15, 0, 12}; int isum = add(iarray);

cout

<< "isum=" << isum <<

endl;

_getch();

 

return 0;

 

}

 

 

int add (int (&piarray)[n])

//размер n массива определен

{int

i , ipartial = 0;

//константа n – глобальная

for

(i=0; i<n; i++)

ipartial +=piarray[i]; return (ipartial);

}

//способ 2 с использованием typedef

const int n=7; //размер массива - глобальная константа, видима везде

typedef int arra[n];

int add(arra); //тип arra объявлен в typedef

int main()

{

static arra iarray = {5, 1, 6, 20, 15, 0, 12}; int isum = add(iarray);

Программирование – лекция 12 (лекции Стрикелевой Л.В.)

11

cout

<< "isum=" << isum <<

endl;

_getch();

 

return 0;

 

}

 

 

int add (arra piar)

 

{int

i , ipartial = 0;

//константа n - глобальная

for

(i=0; i<n; i++)

ipartial +=piar[i]; return (ipartial);

}

//способ 3 без указания размера массива

const int n=7; //размер массива - глобальная константа int add(int []); //прототип функции

int main()

{

static int iarray[n] ={5,1,6,20,15,0,12};

//инициализация массива

int isum;

 

isum= add(iarray);

endl;

cout << "isum=" << isum <<

_getch();

 

return 0;

 

}

 

int add(int iar[])

//определение функции

{ int i, ipartial=0;

//константа n – глобальная

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

ipartial +=iar[i];

 

return (ipartial);

 

}

 

//способ 4 с описанием массива как указателя

int add (int *);

const int n=7; //размер массива – глобальная константа int main()

{int isum;

static int iarray[n] = {5, 1, 6, 20, 15, 0, 12}; isum= adder(iarray);

cout << "isum=" << isum << endl; _getch();

return 0;

 

}

 

int add (int *piar)

 

{int i, ipartial=0;

//константа n – глобальная

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

ipartial += *(piar+i);

//или ipartial += piar[i];

return (ipartial);

 

}

 

Программирование – лекция 12 (лекции Стрикелевой Л.В.)

12

//способ 5 с передачей размера массива

int add (int [], int); int main()

{const int n=7; //размер массива – локальная константа

static int iarray[n] = {5,1,6,20,15,0,12}; int isum= add(iarray, n);

cout << "isum=" << isum << endl; _getch();

return 0;

}

int add (int *piar, int k) // значение k равно n

{int i , ipartial = 0; for (i=0; i<k; i++)

ipartial +=piar[i]; return (ipartial);

}

//способ 6 с указанием количества обрабатываемых элементов

int add (int [ ], int); //появился второй параметр, //количество обрабатываемых элементов

const int n=7; //размер массива – глобальная константа int main()

{int isum;

static int iarray[n] = {5,1,6,20,15,0,12};

//инициализация массива isum= add(iarray, 3); //функции передается массив и

//количество элементов для обработки,

//должно быть меньше размера массива n cout << "isum=" << isum << endl;

_getch(); return 0;

}

//объявление функции

int add (int iar[ ], int k)

{int i, ipartial=0;

//k – формальный параметр

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

ipartial +=iar[i];

 

return (ipartial);

 

}

 

//способ 7 с использованием шаблонной функции (С++ стиль)

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

template<typename T, unsigned N>

T add(T (&arra)[N])

 

{T i , ipartial = 0;

N; ++i)

for (size_t i = 0; i <

ipartial +=arra[i];

return (ipartial);

 

}

13

Программирование – лекция 12 (лекции Стрикелевой Л.В.)

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]