Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
konspekt_1_semestr.doc
Скачиваний:
12
Добавлен:
02.08.2019
Размер:
654.34 Кб
Скачать

Параметры функции

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

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

  1. по значению

  1. по адресу.

Передача по значению

Синтаксис при вызове имя_ф(имя факт. парам);

при определении и объявлении тип имя_ф(тип имя форм параметра);

При передаче по значению в стек заносятся копии значений фактических параметров, и операторы функции работают с этими копиями. Доступа к исходным значениям параметров у функции нет, и поэтому при изменении формальных параметров фактические параметры не изменяются..

Передача по адресу

Используется 2 синтаксиса

1. с помощью ссылки.

при вызове имя_ф(имя факт. парам);

при определении и объявлении тип имя_ф(тип &имя форм параметра);

2. с помощью указателя

при вызове имя_ф(&имя факт. парам);

при определении и объявлении тип имя_ф(тип *имя форм параметра);

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

При передаче по адресу в качестве фактических параметров нельзя использовать выражения, а только имена переменных

#include <iostream.h>

void f(int , int* . int& );

int main(){

int i = 1. j = 2, k= 3;

cout <<"i j k\n";

cout << i <<' '<< j <<' '<< k <<'\n';

f(i, &j, k);

cout << i <<' '<< j <<' '<< k <<'\n';

return 0;}

void f(int i. int* j. int& k)

{

i++; (*j)++; k++;

}

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

Пример: Написать программу, вычисляющую значение и 1-ю, 2-ю производные функции у=х3-2х+1 при заданном значении х.

#include <iostream.h>

#include <math.h>

#include <conio.h>

float dif(float, float &, float *);

void main (void)

{float x,p,p1,p2;

cout<<"y=x^3-2x+3"<<endl<<"x=";

cin>>x;

p=dif(x,p1,&p2);

cout<<"y= "<<p<<endl;

cout<<"y'= "<<p1<<endl;

cout<<"y''= "<<p2<<endl;

getche();}

float dif(float t, float &y1, float *y2)

{y1=2*t*t-2;

*y2=6*t;

return pow(t,3)-2*t+1;}

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

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