2.5. Transmiterea parametrilor prin referin?e

2.5. Transmiterea parametrilor prin referin?e

?n limbajul C exist? doar o singur? modalitate de transmitere a parametrilor ?n func?ii: prin valoare (copie). Astfel, dac? vrem ca o func?ie s? modifice valoarea variabilelor care se transmit ca parametri, trebuie transmise func?iei adresele variabilelor respective.
De exemplu, avem nevoie de o func?ie care schimb? reciproc valorile ?ntre dou? variabile. A?a func?ie poate fi de mare folos la sortarea elementelor unui vector. Versiunea func?iei reprezentat? ?n urm?torul program este gre?it?.

#include "iostream.h"
 
void schimba_reciproc(double a, double b)
// parametrii vor fi transmi?i prin valoare
{
   double temp = a;
   a = b;
   b = temp;
}
 
void main()
{
   double x=2.5, y=3.14;
   cout << "x=" << x << " y=" << y << endl;
   schimba_reciproc(x, y);
   cout << "x=" << x << " y=" << y << endl;
 
   char c; cin >> c; 
}


Fiindc? la apelul func?iei schimba_reciproc(x, y) vor fi transmise copiile valorilor variabilelor x ?i y, valorile variabilelor x ?i y ?n func?ia main() vor r?m?ne neschimbate. Aceasta confirm? ?i rezultatul programului:

x=2.5 y=3.14
x=2.5 y=3.14


Observ?m c? valorile variabilelor x ?i y au r?mas acelea?i. ?n limbajul C exist? o solu?ie unic? de a rezolva aceast? problem?. Trebuie de transmis func?iei adresele variabilelor ?i nu valorile lor. Modific?m programul precedent, ?ntruc?t el va ar?ta astfel:

#include "iostream.h"
 
void schimba_reciproc(double *a, double *b)
// se transmit dou? adrese (doi pointeri)
{
   double temp = *a;
   *a = *b;
   *b = temp;
}
void main()
{
   double x=2.5, y=3.14;
   cout << "x=" << x << " y=" << y << endl;
   schimba_reciproc(&x, &y); // transmitem adresele
                             // variabilelor x ?i y
   cout << "x=" << x << " y=" << y << endl;
 
   char c; cin >> c; 
}


Func?ia schimba_reciproc() a fost modificat? esen?ial. Acum ea prime?te ?n calitate de argumente doi pointeri cu adresele variabilelor de tipul double. Prin intermediul acestor pointeri func?ia dat? are acces la variabilele x, y din func?ia main(). Atragem aten?ia c? s-a schimbat ?i modul de apelare a func?iei schimba_reciproc(). Lans?m programul ?i ob?inem:

x=2.5 y=3.14
x=3.14 y=2.5


Acum rezultatele sunt corecte. Totu?i, ultima versiune a func?iei are un neajuns. De fiecare dat? c?nd programatorul scrie ?n program apelul func?iei schimba_reciproc(), el trebuie s? ?in? cont c? se indic? adresele variabilelor ?i nu ?nse?i variabilele. Adic?, dac? ar fi posibil apelul:

schimba_reciproc(x, y);

el va arat? mai simplu, mai laconic ?i mai natural dec?t apelul:

schimba_reciproc(&x, &y);

?n limbajul C++ exist? posibilitatea de a transmite parametrii ?n func?ii prin referin??.

Pentru ca prima versiune a programului s? fie corect?, modific?m ?n ea doar antetul la descrierea func?iei schimba_reciproc() astfel:

void schimba_reciproc(double &a, double &b)

// parametrii se transmit prin referin?e

Restul r?m?ne acela?i, inclusiv modul de apelare a func?iei schimba_reciproc(). Lans?m programul ?i ne convingem c? rezultatul va fi corect, adic? coincide cu cel de la versiunea cu pointeri.

Transmiterea parametrului prin referin?? (cum ar fi double &a) ?nseamn? c? func?ia respectiv? va lucra direct cu variabila care va fi pus? ca argument ?n apelul acestei func?ii.

Observ?m c? ?ntr-o func?ie se admite combinarea arbitrar? a modurilor de transmitere pentru parametri diferi?i. Programatorul el ?nsu?i urm?re?te acest lucru. De exemplu:

double suma(double *a, int n, int &k)
{}


Func?ia suma() are trei parametri. Primii doi se transmit prin valoare ?i ultimul prin referin?e.
_________________________
Autorul: dr.conf. S. Pereteatcu

рассказать друзьям и получить подарок

Оставить комментарий

Ваш email не будет опубликован. Обязательные поля отмечены *

Вы можете использовать это HTMLтеги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Translate Переводчик

Подписка на новости

SmartResponder.ru
Ваш e-mail: *
Ваше имя: *

Хостинг для Wordpress сайтов