Способы обмена данными

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

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

2. по указателю;

3. по ссылке.

Приведём пример передачи параметров по значению:

Пример:

#include <iostream.h>

double max(double x1, double x2){

//передача параметров по значению

if(x1>x2) return x1; //выход из функции и возврат значения

else return x2; //выход из функции и возврат значения

}

При вызове функции указывается ее идентификатор и фактические параметры. Функция, возвращающая значение, обычно вызывается в выражении.

Пример:

int main(){

double a1=3;a2=2;a3;

a3=max(a1,a2); //вызов функции,

//a1 и a2 – фактические параметры

cout<<a3;

return 0;

}

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

Пример:

void swap(double *a, double *b){ //передача параметров

//по значению, но значениями являются адреса a и b

double c;

c=*a;

*a=*b;

*b=c;

}

main(){

double x=5,y=1;

swap(&x,&y);

return 0;

}

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

Пример:

void swap(double &a, double &b){

double c;

c=a;

a=b;

b=c;

}

main() {

double x=5, y=1;

swap(x,y); //в качестве фактических параметров

//передаются синонимы

return 0;

}

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

Пример:

double sum(int n, double *a) {

double s=0.0;

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

s=s+a[i];

retutn s;

}

int main(){

double arr[3]={3,2,1};//arr – указатель на массив

cout<<sum(3,arr);

return 0;

}

Для передачи адреса массива возможны следующие эквивалентные формы записи:

Пример:

double sum(int n, double a[10]){...}

double sum(int n, double a[]){...}

double sum(int n, double *a){...}

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

Пример:

int fact(int k){

if(k=1)

return 1;

else

return k*fact(k-1); //рекурсивный вызов

}

main(){

cout<<fact(3);

}


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: