Appel C ++ par référence: utilisation de pointeurs [avec des exemples]

Dans le didacticiel sur les fonctions C ++, nous avons appris à passer des arguments à une fonction. Cette méthode utilisée est appelée passage par valeur car la valeur réelle est transmise.

Cependant, il existe une autre façon de passer des arguments à une fonction où les valeurs réelles des arguments ne sont pas transmises. Au lieu de cela, la référence aux valeurs est transmise.

Par exemple,

 // function that takes value as parameter

void func1(int numVal) {
    // code
}

// function that takes reference as parameter
// notice the & before the parameter
void func2(int &numRef) {
    // code
}

int main() {
    int num = 5;

    // pass by value
    func1(num);

    // pass by reference
    func2(num);

    return 0;
} 

Remarquez le & dans void func2(int &numRef) . Cela indique que nous utilisons l’adresse de la variable comme paramètre.

Donc, quand nous appelons le func2() fonction dans main() en passant la variablenumcomme argument, nous passons en fait l’adresse denumvariable au lieu de la valeur5.

Passing value vs. passing reference as function argument in C++
Passage par valeur C ++ ou passage par référence

Exemple 1: passage par référence sans pointeurs

 #include <iostream>
using namespace std;

// function definition to swap values
void swap(int &n1, int &n2) {
    int temp;
    temp = n1;
    n1 = n2;
    n2 = temp;
}

int main()
{

    // initialize variables
    int a = 1, b = 2;

    cout << "Before swapping" << endl;
    cout << "a = " << a << endl;
    cout << "b = " << b << endl;

    // call function to swap numbers
    swap(a, b);

    cout << "\nAfter swapping" << endl;
    cout << "a = " << a << endl;
    cout << "b = " << b << endl;

    return 0;
} 

Production

Avant d'échanger
a = 1
b = 2

Après l'échange
a = 2
b = 1

Dans ce programme, nous avons passé les variablesuneetbà la swap() fonction. Notez la définition de la fonction,

 void swap(int &n1, int &n2) 

Ici, nous utilisons & pour indiquer que la fonction acceptera des adresses comme paramètres.

Par conséquent, le compilateur peut identifier qu’au lieu des valeurs réelles, la référence des variables est passée aux paramètres de fonction.

dans le swap() fonction, les paramètres de fonctionn1etn2pointent vers la même valeur que les variablesuneetbrespectivement. Par conséquent, l’échange a lieu sur la valeur réelle.

La même tâche peut être effectuée en utilisant les pointeurs. Pour en savoir plus sur les pointeurs, visitez Pointeurs C ++.


Exemple 2: passage par référence à l’aide de pointeurs

 #include <iostream>
using namespace std;

// function prototype with pointer as parameters
void swap(int*, int*);

int main()
{

    // initialize variables
    int a = 1, b = 2;

    cout << "Before swapping" << endl;
    cout << "a = " << a << endl;
    cout << "b = " << b << endl;

    // call function by passing variable addresses
    swap(&a, &b);

    cout << "\nAfter swapping" << endl;
    cout << "a = " << a << endl;
    cout << "b = " << b << endl;
    return 0;
}

// function definition to swap numbers
void swap(int* n1, int* n2) {
    int temp;
    temp = *n1;
    *n1 = *n2;
    *n2 = temp;
} 

Production

Avant d'échanger
a = 1
b = 2

Après l'échange
a = 2
b = 1

Ici, nous pouvons voir que la sortie est la même que dans l’exemple précédent. Remarquez la ligne,

 // &a is address of a
// &b is address of b
swap(&a, &b); 

Ici, l’adresse de la variable est transmise lors de l’appel de fonction plutôt que la variable.

Puisque l’adresse est passée au lieu de la valeur, un opérateur de déréférence * doit être utilisé pour accéder à la valeur stockée dans cette adresse.

 temp = *n1;
*n1 = *n2;
*n2 = temp;
 

 *n1 et *n2 donne la valeur stockée à l’adressen1etn2respectivement.

Puisquen1etn2contiennent les adresses deuneetb, tout est fait pour *n1 et* n2changera les valeurs réelles deuneetb.

Par conséquent, lorsque nous imprimons les valeurs deuneetbdans le main()