Parametri

  Parametrii unei funcții nu sunt „variabile reale”, ei sunt legați de o adresă abia în momentul executării subprogramului.

    Cunoaștem 2 categorii:
  • parametri formali - se găsesc în antetul funcției și vor fi folosiți în subprogram pentru a descrie anumite procese de calcul;
  • parametri actuali - sunt cei care apar în apelul funcției, urmând a se face legătura adreselor cu cei formali.
...
void Operatie(int a, int b) // parametrii formali
{
  ...
}
int main(){
  ...
  Operatie(x,y); // parametrii actuali
  ...
}

Parametrii formali

  Când scriem parametrii formali în antetul unei funcții, vom pune în fața fiecăruia și tipul de dată, chiar dacă sunt de același tip. Tablourile vor avea incluse și dimensiunile.
  În interiorul subprogramului, îi vom folosi în diverse operații pe care le vom vrea să fie executate pentru datele introduse ulterior în apel. Pentru a clarifica:

void CitireVector(int A[101], int&n){
  cin>>n;
  for(int i=0; i<n; i++) cin>>A[i];
}

  Am descris un simplu subprogram de citire a elementelor unui vector. Parametrii sunt: un vector A cu 101 elemente și n, numărul de elemente.
  În funcție, l-am folosit pe n transmis ca parametru pentru a memora numărul de elemente, iar apoi în fiecare element al lui A am introdus ceva. Simbolul de lângă parametrul n este explicat mai jos, ajungem imediat și acolo.


Parametrii actuali

  Spre deosebire de parametrii formali, la apel nu vom adăuga nici tipul de dată al variabilelor, nici dimensiunile tablourilor (tipul trebuie să corespundă totuși).
  În apel vom introduce variabile în ordinea în care dorim să corespundă cu parametrii formali, pentru a fi inițializați corespunzător. Considerând subprogramul anterior, exemple de apeluri ar fi:

int B[101],C[101],X[101],b,c,x;
CitireVector(B,b);
CitireVector(C,c);
CitireVector(X,x);

  Am atașat și declararea variabilelor pe care le folosim ca parametri actuali pentru a accentua că, deși la apel nu mai atașăm și tipul de dată, el trebuie să corespundă cu parametrul formal.


Transmiterea parametrilor

1. Transmiterea prin valoare

  Parametrii formali primesc copii ale valorilor parametrilor actuali; aceste copii vor fi șterse după executarea instrucțiunilor din funcție. Explicat altfel, când se transmite un parametru prin valoare, orice modificare suferă această variabilă nu este „permanentă” (se modifică o copie, iar conținutul din adresa parametrului rămâne neschimbat).
  Se transmite un parametru prin valoare atunci când în antet între tipul datei și numele unui parametru formal nu se află nimic (adică un spațiu :D).

int f1(int a, float b);
int f2(char c);

  Toți cei 3 parametri sunt transmiși prin valoare. Orice modificare pe parcursul executării subprogramelor nu va afecta valoarea originală, doar copia.

2. Transmiterea prin referință

  În cazul transmiterii prin referință, parametrii formali primesc adresele parametrilor actuali introduși, astfel modificările efectuate pe parcursul funcției sunt „permanente” (vizibile la sfârșitul apelului).
  Transmiterea prin adresă este asemănătoare cu cea prin referință, doar că prima se adresează în special pointerilor. Pentru BAC, ne interesează transmiterea prin referință. Deseori în limbajul liber mai numim ambele procedee ca „transmitere prin adresă”... să zicem că nu e atât de greșit :D.

int f(int&x); // referință
int g(int*x); // adresă

  Exemplu de program care arată influența referinței lângă parametrul formal:

#include <iostream>
using namespace std;
int n;
void f1(int x){
  x=5;
}
void f2(int&x){
  x=10;
}
int main(){
  cin>>n;
  cout<<n<<'\n';;
  f1(n);
  cout<<n<<'\n';
  f2(n);
  cout<<n<<'\n';;
  return 0;
}
1
1
1
10

  Funcția f1 primește un întreg ca parametru prin valoare, iar f2 un întreg prin referință.
  Vom realiza 3 afișări. După ce îl citim, afișăm valoarea numărului (practic valoarea inițială); apelăm prima funcție, unde vedem că în interior se schimbă valoarea parametrului în 5. Deoarece este transmis prin valoare, la finalul executării, n (parametrul actual), va avea aceeași valoare inițială (lucru evidențiat de a doua afișare). După apelul lui f2, modificarea lui n va fi vizibilă și după ieșirea din subprogram, astfel că în ultima afișare se scrie 10.