Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛР13-С++17-мая-2012.doc
Скачиваний:
13
Добавлен:
15.09.2019
Размер:
1.3 Mб
Скачать

1.6. Передача параметров в функцию. Изменяемые значения параметров

1.6.1. Передача параметров

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

В C существуют три способа передачи параметров в функцию:

– по значению;

– по ссылке;

– по указателю.

1.6.2. Передача параметров по значению

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

В момент обращения к функции в памяти создаются временные переменные с именами, указанными в списке параметров, в которые копируются значения фактических (передаваемых в функцию) параметров. После завершения работы функции временные переменные удаляются из памяти.

Пример 13.14

Вычислить сумму двух переменных x и y.

double Sum(double a, double b)

{

return a+b; // Вычисление и передача результата

}

s = Sum (x, y); // Вызов функции Sum

Функция Sum не может изменить значения используемых при вызове функции переменных x и y, так как работает только с их локальными копиями.

1.6.3. Передача параметров по ссылке

При передаче параметров по ссылке передается адрес соответствующей переменной, а не ее значение. Для получения адреса используется операция разадресации («&»).

Пример 13.15

Поменять местами значения двух переменных x и y.

void Swap_Ref (double &a, double &b)

{

int tmp = a;

a = b;

b = tmp;

}

Swap_Ref (x, y); // Вызов функции Swap_Ref

При таком способе передачи параметры a и b будут инициализированы в качестве псевдонимов переменных-аргументов x и y. Поэтому любые изменения параметров a и b будут приводить к соответствующему изменению переменных x и y.

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

тип_ функции имя_функции (тип_параметра & имя_параметра)

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

Механизм такого способа передачи данных заключается в том, что функция и вызывающая программа работают с адресом объекта в памяти (фактически, с одной и той же областью данных). Как результат, значения параметров функция может изменить. Как следствие, фактическим параметром, соответствующим формальному параметру — ссылке, может быть только имя переменной.

Пример 13.16

Функция находит площадь и периметр треугольника, заданного длинами сторон. Возвращаемых значений два — площадь и периметр. Эти значения функция вернет через параметры. Кроме того, нужна проверка условия существования треугольника. Это логическое значение функция вернет через return (1, если треугольник существует, и 0, если нет).

#include <stdio.h>

#include <math.h>

int Triangle (float a, float b, float c, float & p, float &s)

{

// эта функция имеет два варианта выхода

// параметры a,b,c передаются по значению (только входные данные),

// параметры p, s, по ссылке (как входные данные, так и результат)

float pp; // полупериметр

if (a+b <=c || a+c<=b || b+c<=a) // треугольник не существует

return 0;

else

{ // треугольник существует

p = a + b + c;

pp = 0.5 * p;

s = sqrt (pp* (pp – a)*(pp – b)*(pp – c));

return 1;

}

}

// при обращении фактическими параметрами, подставляемыми на место

// формальных параметров-значений, могут быть выражения, а фактическими

// параметрами, подставляемыми на место формальных параметров-адресов,

// могут быть только переменные

void main (void)

{

float A, B, C; // длины сторон фактические

float Perim, Square; // периметр и площадь фактические

// пример обращения

printf("Введите длины сторон треугольника\n");

scanf ("%f%f%f", &A, &B, &C);

if (Triangle (A, B, C, Perim, Square) = = 1)

printf("Периметр равен %6.2f, площадь равна %6.2f\n", Perim, Square);

else

printf ("Треугольник не существует\n");

}