Передача по значению и передача по ссылке
Аргументы в функцию можно передавать двумя способами.
Первый называется передачей по значению. Данный метод копирует содержимое аргумента в формальный параметр функции. Изменения, сделанные в параметре при выполнении функции, не влияют на значение переменной, используемой при вызове функции.
Передача по ссылке является вторым способом передачи аргументов. В данном методе копируется адрес аргумента. В подпрограмме адрес используется для доступа к настоящему аргументу, используемому при вызове. То есть, изменения, сделанные в параметре при выполнении функции, влияют на содержимое переменной, используемой при вызове.
В языке С для передачи аргументов в функцию используют, в основном, передачу по значению. Это означает, что обычно нельзя изменять переменные, используемые при вызове функции. Рассмотрим следующую функцию:
#include <stdio.h>
int sqr (int x);
int main (void)
{
int t = 10;
printf(“%d %d”, t, sqr(t) )
return 0;
}
int sqr (int x)
{
x = x*x;
}
В данном примере значение аргумента, передаваемого в sqr (), равное 10, копируется в параметр x. Когда происходит присваивание x = x*x, изменяется только локальная переменная х. Переменная t, используемая при вызове sqr(), по-прежнему содержит значение 10. Следовательно, на экране появится «10 100».
Следует помнить, что только копия аргумента передается в функцию. Все, что происходит в функции, не влияет на переменную, используемую при вызове.
Создание передачи по ссылке
Параметры можно передавать в функцию по ссылке. Для этой цели используются указатели. Поскольку в данном случае происходит передача адреса аргумента, возможно изменение значения аргумента, находящегося вне функции.
Указатели передаются в функции как и обычные значения. Конечно, необходимо объявлять параметры типа указатель. Ниже приведена функция swap(), обменивающая значение двух целочисленных аргументов:
Void swap(int *x, int *y)
{
int temp;
temp = x; /* сохранение значения по адресу */
*x = *y; /* помещение у в х */
*y = temp; /* помещение х в у */
}
Оператор * используется для доступа к переменным, на которые указывает операнды. Следовательно, содержимое переменных, используемых при вызове функции, обменивается.
Важно помнить, что swap() (или любая другая функция, использующая указатели на параметры) должна вызываться с адресами аргументов. Следующая программа демонстрирует правильный способ вызова swap ():
#include <stdio.h>
void swap (int *x, int *y);
int main (void)
{
int x, y;
x = 10;
y = 20;
swap(&x, &y);
printf(“%d %d”, x, y);
return 0;
}
В данном примере переменной х присваивается значение 10, а у – 20. Затем вызывается функция swap() с адресами х и у. Унарный оператор & используется для получения адресов переменных. Поэтому в функцию swap() передаются адреса х и у, а не их значения.
Методические указания
а) При определении суммы членов ряда следует использовать реккурентную формулу для получения следующего члена ряда .
Например, требуется найти сумму ряда с точностью = 10-4, общий член которого
Для получения реккурентной формулы вычислим отношение последующего члена ряда к текущему:
откуда
.
б) заданную точность оценивать по последнему члену ряда, т. е. an .
Пример программы
#include <stdio.h>
#include <conio.h>
main()
{
float const eps = 1e-4; /* заданная точность */
int n=1;
float An, sum=0.0;
An = 1/3;
while (An <= eps)
{
sum = sum+An;
n++;
An = An*(n+1)/(2*(2*n+1);
} /* конец while */
clrscr();
printf(“ Сумма = %f\n Последний член ряда = %f”, sum, An);
}
Варианты задания
№ варианта |
Функция |
Начальное значение |
Шаг |
Конечное значение |
Погрешность |
1 2
3
4
5
6
7
8 9 10
11
12
13
14
|
ex e-x
sin x cos x
|
0.730 0.730
0.015
0.025
0.08
0.00
0.70
0.10 0.015 0.035
40o
50o
16o
15o
|
0.005 0.005
0.001
0.001
0.02
0.05
0.01
0.01 0.001 0.002
20’
20’
15’
6’
|
0.780 0.780
0.035
0.045
0.80
0.95
0.90
0.25 0.027 0.055
45o
55o
20o
16o
|
10-6 10-6
10-6
10-7
10-8
10-6
10-6
10-6 10-5 10-6
10-5
10-7
10-6
10-7
|
Разложения в степенной ряд функций, указанных выше:
