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

Способы передачи данных в функцию

Данные в функции передаются по значению, адресу или ссылке.

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

Передача данных по адресу.

Адрес – уникальная и однозначная характеристика данного. Зная адрес данного, можно извлечь данное по адресу или изменить данное по адресу. В функцию через параметр мы можем передать адрес данного, объявленного в функции main. Внутри функции мы можем извлечь данное по адресу или изменить данное по адресу. Этот механизм используется для передачи из функции результатов, если их больше чем один.

Данное, переданное по адресу, можно использовать внутри функции и изменять.

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

Механизм передачи второго, третьего ……. Результата из функции.

Пусть из функции необходимо предать через параметры результат целого типа.

Необходимо:

  • Объявить в функции main переменную целого типа под результат.

  • В функции main в операторе вызова этой функции в качестве соответствующего аргумента передать адрес объявленной переменной.

  • В имени функции и в прототипе объявить параметр указатель на целый тип.

  • Внутри функции вычислить результат и записать его значение по указанному в параметре адресу.

То же самое схематично:

# include…..

void func (…, int*p);

void main (void)

{……………………….

Int res; //переменная целого типа под результат.

…………………………

…………………………

… func (…, & res); // передали в функцию адрес переменной res.

Printf (“res=%d\n”, res); //вывели полученный из функции результат

}

… funs (…, int*p)

{……………………….

Int res; //объявили переменную под результат

……………………….

Res=…; //вычислили результат

*p=res; // возвратили результат функции через параметр

return…;

}

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

Запретить изменение аргумента, при передаче адреса можно, для этого надо объявить параметр const int *p;

Передача аргумента по ссылке

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

Int SomeInt;

int & rSomeInt=SomeInt;

При передаче по ссылке экономится память и есть прямой доступ к аргументу. При необходимости аргумент можно защитить от изменения:

const int & Ra;

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

Анализ характеристик функции

1. Название функции: kvadr

2. Исходные данные (коэффициенты double a,b,c)

3. Результаты (через return передаем результат типа bool(который true-false))

корень x1: double &x1;

x2: double &x2;

// kvadr.cpp

#include <math.h>

bool kdvadr(double a, double b, double c, double &x1, double &x2)

{

double d;

d = b*b-4*a*c;

if (d>=0)

{

x1=(-b+sqrt(d))/(2*a)

x2=(-b-sqrt(d))/(2*a)

return true;

}

else { return false; }

}

// kvadr.h

#ifndef KVADR_H

#define KVADR_H

bool kdvadr(double a, double b, double c, double &x1, double &x2);

#endif

// main.cpp

#include<iostream> //подключение системных средств для

using namespace std; //возможности использовать потоки ввода-вывода

#include «kvadr.h»

int main (void) {

double a, b, c, x1, x2;

bool result;

cout << “\nВведите коэффициенты” << endl;

cin >> a >> b >> c;

result = kdvadr (a,b,c, x1, x2);

if (result == true) {

cout << “\nx1=” << x1 << “\nx2=” << x2 << endl;

} else { cout << “\nНет корней” << endl; }

return 0;

}

Выводы:

1. Если аргумент не меняется внутри функции и занимает немного оперативной памяти – передача по значению

2. Если аргумент не должен изменяться, но занимает много оперативной памяти – передача по ссылке на неизменяемый объект или через указатель на неизменяемый объект

3. Если аргумент должен изменяться внутри функции – передача по ссылке или через указатель

4. Любой массив передается через указатель

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